{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Pattern Recognition and Machine Learning"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from scipy.stats import norm\n",
    "from scipy.special import gamma\n",
    "plt.style.use(\"seaborn\")\n",
    "\n",
    "from itertools import product"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from itertools import combinations_with_replacement\n",
    "import sympy\n",
    "sympy.init_printing()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Exercise 1.15\n",
    "The $M$-th order term for a $D$-dimensional polynomial is given by\n",
    "$$\n",
    "    \\sum_{i_1=1}^D \\sum_{i_2=1}^D \\dots \\sum_{i_M=1}^D w_{i_1,i_2,\\ldots,i_M}x_{i_1}x_{i_2}\\ldots x_{i_M}\n",
    "$$\n",
    "Show that we can rewrite the last expresion by removing redundant terms in the form:\n",
    "$$\n",
    "    \\sum_{i_1=1}^D \\sum_{i_2=1}^{i_1} \\dots \\sum_{i_M=1}^{i_{M-1}} \\tilde w_{i_1,i_2,\\ldots,i_M}x_{i_1}x_{i_2}\\ldots x_{i_M}\n",
    "$$\n",
    "\n",
    "Note: the number of independent parameters is significantly fewer due to the many interchange symmetries of the factor $x_{i_1}x_{i_2}\\ldots x_{i_M}$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "terms = range(1, 4)\n",
    "i, j, k = symbols(\"i j k\", integer=True)\n",
    "what = IndexedBase(\"\\hat{w}\")\n",
    "x = IndexedBase(\"x\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def extract(iterable: list, elements: list) -> list:\n",
    "    \"\"\"\n",
    "    Extract and convert elements from a multi-level\n",
    "    list into a 1D list\n",
    "    \"\"\"\n",
    "    for el in iterable:\n",
    "        if type(el) == list:\n",
    "            extract(el, elements)\n",
    "        else:\n",
    "            elements.append(el)\n",
    "    return elements"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def term2d(i, j): return Indexed(\"\\hat{w}\", i, j) * Indexed(\"x\", i) * Indexed(\"x\", j)\n",
    "def term3d(i, j, k): return Indexed(\"\\hat{w}\", i, j, k) * Indexed(\"x\", i) * Indexed(\"x\", j) * Indexed(\"x\", k)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### For $D=2$, $M=3$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAHsAAAA+BAMAAAD5fHmTAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAzXZUMhAiRGar792Zu4mlExrhAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADsklEQVRIDe1WTWgTQRT+ms1mU5psYy9WRLoVerDEmh4qWCnUi4KILlGEFmlzEUWESg8iemh6ExQMghUUahEVL9Kq4FGrXnrwpyj15yAGQaFIsf5UxQrrm5mdnU0TupuLXnyHed+8ed/uzCTf2weQ1Tg+s1ikKtOcbzxf33vsgjNWFZUnX1r0OKe+ejA0qHMKXu59D4UGUeenl5vo9mBocMbJebmWh0KDpDNRKdeYrBQtj+njv8uDwKbTlaIVYkNOpjxqFI1iebRSxHSuVgqHjjV9Dp1aKbHXKS4JZx8gntJ8m9LXjgy+40nZdQfarJJ0zflRMgeKnUgWjB+ITPKFlejDKesmkIZejN+qS5FWjijK01+2mhCKZe6jPo8XiOZ4PIP3+GRvBLbCtM0FjaIaXxBD3ZLd67iMXTlMqhQba8RER820CgsUWyx9O4zvaKUj+PO+yEm9JZH0kWsSuT4xgdd0BGMdm+vpDBBluh4s0LCrm4bsQxqkDXVL5PpkAXdhwuxnu0poKXRE5tGC9wvQ7A2I2JhsV4xomc4jKeMGtmH/Zpa01ywYX5PzsXxs9wSGMm9xEHpuVtF7LYVd9OhdT1seeManybx+tiV9Ekha6FmbnaIFvOIrfFilYCnSF7pZoD7HRrL+PcLT+N1DyZQHlwAtVYzNANtluN2UKDomET6y+xGWkUB4fTQXvQ6sl9GeDxJFpiWKq18tvoTOUujvJW5A5nNPt+Ca71c7LmM+v7H2qE867sL5Q3LHMfWr7atUdvK1sznf0wQcHZGh3qKLYpvcL4ZcCeWbVnBbPU4fq4lQDH9SwveJcyz/yn+83A1s8RbdmgiY6XNeMADsuCgSumy3JmozmMLjAJZa5tUA7S1uRGuw8QRn1HoA4vRhy82KN3BQ3dub80RiNTHSyNn6Fe7CDPT2E1yjVBON24LRbIVh8hyi971kiGqiPndE8KrbfN9zxqKKoM/xjWBAOPGsZUd+dezMoibSNdDJB/LLcnyLnRzHG0E1kcHhPO6g1ebR4OHwvbM8SbOpJnLUgZ1tXiEJfsC/zuh6Q8ZOqzFA34S/Z0qwvl4lHfb9PsG6vQoplvqXsMb/NkqwYIqtwjh92JIMV7FyGugZnQuW9ypCsbx/CWTyBKILwbJexVUs9S9hjehCsKxXEYpl/UtYY5sXgmW9ilCs+nIHPoXR3SLFexV2D77+JYjvCRZur0KKVf1LEFsJFrJX6YDqX4LovvUqTuxjSah6FRkJ6buYTm3Wq1Sr2D+/k+xDiRu72wAAAABJRU5ErkJggg==\n",
      "text/latex": [
       "$$\\sum_{\\substack{1 \\leq i \\leq 3\\\\1 \\leq j \\leq i}} {\\hat{w}}_{i,j} {x}_{i} {x}_{j}$$"
      ],
      "text/plain": [
       "  i     3                          \n",
       " ___   ___                         \n",
       " ╲     ╲                           \n",
       "  ╲     ╲   \\hat{w}[i, j]⋅x[i]⋅x[j]\n",
       "  ╱     ╱                          \n",
       " ╱     ╱                           \n",
       " ‾‾‾   ‾‾‾                         \n",
       "j = 1 i = 1                        "
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Sum(term2d(i, j), (i, 1, 3), (j, 1, i))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$${\\hat{w}}_{1,1} {x}_{1}^{2} + {\\hat{w}}_{2,1} {x}_{1} {x}_{2} + {\\hat{w}}_{2,2} {x}_{2}^{2} + {\\hat{w}}_{3,1} {x}_{1} {x}_{3} + {\\hat{w}}_{3,2} {x}_{2} {x}_{3} + {\\hat{w}}_{3,3} {x}_{3}^{2}$$"
      ],
      "text/plain": [
       "                  2                                               2           \n",
       "\\hat{w}[1, 1]⋅x[1]  + \\hat{w}[2, 1]⋅x[1]⋅x[2] + \\hat{w}[2, 2]⋅x[2]  + \\hat{w}[\n",
       "\n",
       "                                                              2\n",
       "3, 1]⋅x[1]⋅x[3] + \\hat{w}[3, 2]⋅x[2]⋅x[3] + \\hat{w}[3, 3]⋅x[3] "
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "elements = [[term2d(i, j) for j in range(1, i + 1)] for i in terms]\n",
    "simple_term = sum(extract(elements, []))\n",
    "simple_term"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAH0AAAA+BAMAAAD0YgnUAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAzXZUMhAiRGar792Zu4mlExrhAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAD5klEQVRIDe1WS2gUSRj+pnt6eoIzk9GLXpYdhRwMs3FyiKASnL0oLLJpsquQHGLDIooIEQ9ePNjBiy8wCOpB0CC7sJfVrKKHPWzGx0HxFRVfB8kQUPAgxkd8gu1f1V1VnZ7uyYwH8eB/qPrq+/+/3n/VDzD50VXykjPNFSvdMndYu3HPqQ/NuXLrFndUeKXHSgI2UY+9l8aZvISNgx7XkcaXJGocpN030liTqAkw8THS2KxE0rVkvxtpuWx/rWkkY7qvInizalYj6Cjq+Qcrim6YS7hfcm6qe+PUJ9XwUO8FpPP6X4o2Fh3eNsmbvYs3dhSUgqGV7taZBKrLkR0230KrcMV8DGBf4V+gCKOaPj2H5psIuGTcwEjMIVU6j1YH95C0uX8Jj/HcWgqsQs7KTevE6lzhF2OhBRg4gR4bFWVj4QevYSAxrmgfDZ4NUeYbtAPVICuDu7UQpDlut0NUZhQPaRXmYsYbxRKQfE1o2zAVPWUqei9SIcRkuhmSHcb/yCG33iI6o+fRpU2hDY+noVtLoFmodAbse6j/maLlzX+wGhtWMHpdbth8lZ1KOanfRrGzNIFNMOynysE4obBA1yb7OhzgNm9nHeNgW3E3kC2gb1HvZVLgAdfwIsFWFSnGdJnxrTYrSdb/7tVUqqDHLUmGgZ6vpu4Cvwi+MydQckQg5NThzbgUZGAcs5N/Az8J274nAmnjAmGvLeEuiRSgPr1dUBQh2glfAodnjggyUC9t2R663aQ8spkdLJdBeXjGzYrPBSun5akdbHN87LCgjJMC/XHc/0oE0VCdeDGXy3/0jUU/pPW7uam+P1eGSH2X71p/B5J5uRVFgSavyJshqLg6eWWUq3QKkVUcdVsZJzMeZ1/D69xfnydG7GxDppqeqrGLI7h/ep5QDxUYanJ8bQFzYg/jQoch9Jd51UhB45tnuCE9jDtKHGlyOrP3QP7Gs61kxx7GgfueQ5PzN56xcdlzMHCHd5CKyga8rsOlt/9s3fxhZFvRX069C5vFtvURrhpy4D2M6QWYY2u1r01MB6mr7wtc1QX/YdSt5GTEaxPj/y3Q+iMSuv9AN0PWV53Tz2o0mc7kiocUWx+tOerpu2nW3s9FkXwZ1+t7BbT8dwdFrS8skm/ggGjOWnP/oYKw8yO5ufHZ7fXSGS+SYfwp+pu1pvH9qKV0xo9kLCzM6icMyN+LWpbOeJFMqubm70ftA0oWeCQD6kMW48TVfP+8ZfN0hvaCVj/oxNmH+eWcoKiFn84MOTiH9kYv8Zaxg7wD3YJIZ7rwa4dMDcLD1WmrdKaOUbwqkM7EG0VqvKhl6YyK5EjDWvIzjyz4F1k0RWcAAAAASUVORK5CYII=\n",
      "text/latex": [
       "$$\\sum_{\\substack{1 \\leq i \\leq 3\\\\1 \\leq j \\leq 3}} {\\hat{w}}_{i,j} {x}_{i} {x}_{j}$$"
      ],
      "text/plain": [
       "  3     3                          \n",
       " ___   ___                         \n",
       " ╲     ╲                           \n",
       "  ╲     ╲   \\hat{w}[i, j]⋅x[i]⋅x[j]\n",
       "  ╱     ╱                          \n",
       " ╱     ╱                           \n",
       " ‾‾‾   ‾‾‾                         \n",
       "j = 1 i = 1                        "
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Sum(term2d(i, j), (i, 1, 3), (j, 1, 3))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$${\\hat{w}}_{1,1} {x}_{1}^{2} + {\\hat{w}}_{1,2} {x}_{1} {x}_{2} + {\\hat{w}}_{1,3} {x}_{1} {x}_{3} + {\\hat{w}}_{2,1} {x}_{1} {x}_{2} + {\\hat{w}}_{2,2} {x}_{2}^{2} + {\\hat{w}}_{2,3} {x}_{2} {x}_{3} + {\\hat{w}}_{3,1} {x}_{1} {x}_{3} + {\\hat{w}}_{3,2} {x}_{2} {x}_{3} + {\\hat{w}}_{3,3} {x}_{3}^{2}$$"
      ],
      "text/plain": [
       "                  2                                                           \n",
       "\\hat{w}[1, 1]⋅x[1]  + \\hat{w}[1, 2]⋅x[1]⋅x[2] + \\hat{w}[1, 3]⋅x[1]⋅x[3] + \\hat\n",
       "\n",
       "                                        2                                     \n",
       "{w}[2, 1]⋅x[1]⋅x[2] + \\hat{w}[2, 2]⋅x[2]  + \\hat{w}[2, 3]⋅x[2]⋅x[3] + \\hat{w}[\n",
       "\n",
       "                                                              2\n",
       "3, 1]⋅x[1]⋅x[3] + \\hat{w}[3, 2]⋅x[2]⋅x[3] + \\hat{w}[3, 3]⋅x[3] "
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "full_term =  summation(term2d(i, j), (i, 1, 3), (j, 1, 3))\n",
    "full_term"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$${\\hat{w}}_{1,1} {x}_{1}^{2} + 2 {\\hat{w}}_{1,2} {x}_{1} {x}_{2} + 2 {\\hat{w}}_{1,3} {x}_{1} {x}_{3} + {\\hat{w}}_{2,2} {x}_{2}^{2} + 2 {\\hat{w}}_{2,3} {x}_{2} {x}_{3} + {\\hat{w}}_{3,3} {x}_{3}^{2}$$"
      ],
      "text/plain": [
       "                  2                                                           \n",
       "\\hat{w}[1, 1]⋅x[1]  + 2⋅\\hat{w}[1, 2]⋅x[1]⋅x[2] + 2⋅\\hat{w}[1, 3]⋅x[1]⋅x[3] + \n",
       "\n",
       "                  2                                                 2\n",
       "\\hat{w}[2, 2]⋅x[2]  + 2⋅\\hat{w}[2, 3]⋅x[2]⋅x[3] + \\hat{w}[3, 3]⋅x[3] "
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "replacement = {what[x, y]: what[y, x] for x, y in ([2, 1], [3, 1], [3, 2])}\n",
    "full_term.xreplace(replacement) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$$\\left({\\hat{w}}_{1,2} + {\\hat{w}}_{2,1}\\right) {x}_{1} {x}_{2} + \\left({\\hat{w}}_{1,3} + {\\hat{w}}_{3,1}\\right) {x}_{1} {x}_{3} + \\left({\\hat{w}}_{2,3} + {\\hat{w}}_{3,2}\\right) {x}_{2} {x}_{3} + {\\hat{w}}_{1,1} {x}_{1}^{2} + {\\hat{w}}_{2,2} {x}_{2}^{2} + {\\hat{w}}_{3,3} {x}_{3}^{2}$$"
      ],
      "text/plain": [
       "                                                                              \n",
       "(\\hat{w}[1, 2] + \\hat{w}[2, 1])⋅x[1]⋅x[2] + (\\hat{w}[1, 3] + \\hat{w}[3, 1])⋅x[\n",
       "\n",
       "                                                                        2     \n",
       "1]⋅x[3] + (\\hat{w}[2, 3] + \\hat{w}[3, 2])⋅x[2]⋅x[3] + \\hat{w}[1, 1]⋅x[1]  + \\h\n",
       "\n",
       "                2                     2\n",
       "at{w}[2, 2]⋅x[2]  + \\hat{w}[3, 3]⋅x[3] "
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "collect(full_term, [x[1]*x[2], x[1] * x[3], x[2] * x[3]])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "-------"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### For $D=3$, $M=3$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAKEAAABNBAMAAAA8+Rl8AAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAzXZUMhAiRGar792Zu4mlExrhAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEyUlEQVRYCe1YXWgcVRQ+Oz87G7K7WfugeRHHYh4a0jp5aIVK6OpDBRUyxB9IHtIBKS0iNBT0wYjO0hd/XkKQKgg1BARfbFdFBB/M+vNgUWisqPVBugQqFCyN1q2mguM593d2O+l2ZvoQxBP23u+ee863d2ZnvntyAcjuirT9zjx5m31RnVE8ceiVU9fykrH8gagpeUornoS5+pUNlV6uKZgHTEahSv9SoTygFF1V6YZCucD5v5PTX0h234R3JmolRZlvJrqTQnt9TnSl10XjF/Evq12+5mdN3SSvEN2ap0bT26f+0QOOpj6HUs18p9cN9vbjR9eYd2rHoV1uD9Lh+6I5PWCovRcqC86fYLTY8A5sjZPYzMJr7vsAY2C3Sx8M4qUV5gQabbNI0ZSjntUUvc9gKIQfwApYiEftx/i5AJf9PQD7oepXO2YAYEo02L2olZ7LtmEZJgNoIYcyu4PQhzu5w4bCahc64KtIAkc+6hoCOFdhFKAd9zpNNlKKN+TKWYbm5Yj3o0H3GMpN+AmKnrOD/PaYh2219eACgPUHwqMIYLKOzdQXEv1qsVgckjkU1mWVBfgUqlBl11I2azhZOPZsB3Yb6zACFzpg+veC4UNrXKLh++LXPUlr6DKj5rwHD8HB+8n7ZJXWNPQ6fvWVynoxLD7WhJe883AY7OCiQLBRp1Bh9rJEuv9mbXpXCHCWeSqI4OGdHtiLI2MvA1RcmN4+9RV5zwlkLX+HI2kFWkKi2Z06+YcCbHY6S3XsyA48zntspRIaq89bygnfatiDzFq7+D0uD7A9azXbYnq8KuOsJYEq7iPKCVX96JgyUvT2icB6F5cH2N4Oi3Xhnv5FxhmrAhWCgXukE14NFDymkAb4LXg3e79LzOMdvd5ij46zdP007Bl4Dt9RfPUS7I2n/QTvEU867TMtCWN9OHAxAAhjHg1PHNdYIfukhE+9LYoB6cjYF367jdknWKxssoWlZD6jy55IqUBKjv/Db/UdsGqKcUyitdNJD62c7dNbp5sswkQx2M/QhF8Oy6t90m40bTJGc5tc1fgIlNul9Rul9JljjKVtMqrhEsq9RmOYaGgvujskBDN11mVrcI3OhywV96J5jyFDLTkLJzLal+Ywk/ai2R85Re6rti/R2kg5Z/neU0ysJvm39W35b033j+1FdEtn6sW/+uZtHmAusblGCHwvKg3DYGCgYme14tcbLsvdDWIvMn1rjRT7v27mz2j4XgNMEPK33vU+oJdUoCedTJTefJC2ffQtnjGBF8uLBkSi9E7LJeJZeQgoYsI0kp60PWNsuDJNI+lJ3RMjvYS8oGaIl97kymTIKEQMC2qOeOmdiY2SkJGLGBXUHPHSOw+jFLFzUs6wWMxh7Jfh+wIV1IRE6Z2VdC9LRBEDXlAjwtI7KxvmPbOyyLJNH0RBbfpYeudgjKUmFtSx+dQwuaBOTcMSuIhRQb015UyLWfxMQOla+ouOiZk8E9C6lp6OMtgDzsRM/G+cW80YY8NF7nn8ADRcavMYMXIxY2cCWtcykyKjEDM6E9C6lplQixk7E9C6louRixk/ExDFGepaZmO/DEmYOBPQupaVUomZPBPQupaNUouZOhPQupaNMjFr6+laTMK0riWu/Sac/wIaSkH15qIG4gAAAABJRU5ErkJggg==\n",
      "text/latex": [
       "$$\\sum_{\\substack{1 \\leq i \\leq 3\\\\1 \\leq j \\leq i\\\\1 \\leq k \\leq j}} {\\hat{w}}_{i,j,k} {x}_{i} {x}_{j} {x}_{k}$$"
      ],
      "text/plain": [
       "  j     i     3                                  \n",
       " ___   ___   ___                                 \n",
       " ╲     ╲     ╲                                   \n",
       "  ╲     ╲     ╲   \\hat{w}[i, j, k]⋅x[i]⋅x[j]⋅x[k]\n",
       "  ╱     ╱     ╱                                  \n",
       " ╱     ╱     ╱                                   \n",
       " ‾‾‾   ‾‾‾   ‾‾‾                                 \n",
       "k = 1 j = 1 i = 1                                "
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Sum(term3d(i, j, k), (i, 1, 3), (j, 1, i), (k, 1, j))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$${\\hat{w}}_{1,1,1} {x}_{1}^{3} + {\\hat{w}}_{2,1,1} {x}_{1}^{2} {x}_{2} + {\\hat{w}}_{2,2,1} {x}_{1} {x}_{2}^{2} + {\\hat{w}}_{2,2,2} {x}_{2}^{3} + {\\hat{w}}_{3,1,1} {x}_{1}^{2} {x}_{3} + {\\hat{w}}_{3,2,1} {x}_{1} {x}_{2} {x}_{3} + {\\hat{w}}_{3,2,2} {x}_{2}^{2} {x}_{3} + {\\hat{w}}_{3,3,1} {x}_{1} {x}_{3}^{2} + {\\hat{w}}_{3,3,2} {x}_{2} {x}_{3}^{2} + {\\hat{w}}_{3,3,3} {x}_{3}^{3}$$"
      ],
      "text/plain": [
       "                     3                        2                               \n",
       "\\hat{w}[1, 1, 1]⋅x[1]  + \\hat{w}[2, 1, 1]⋅x[1] ⋅x[2] + \\hat{w}[2, 2, 1]⋅x[1]⋅x\n",
       "\n",
       "   2                        3                        2                        \n",
       "[2]  + \\hat{w}[2, 2, 2]⋅x[2]  + \\hat{w}[3, 1, 1]⋅x[1] ⋅x[3] + \\hat{w}[3, 2, 1]\n",
       "\n",
       "                                       2                                  2   \n",
       "⋅x[1]⋅x[2]⋅x[3] + \\hat{w}[3, 2, 2]⋅x[2] ⋅x[3] + \\hat{w}[3, 3, 1]⋅x[1]⋅x[3]  + \n",
       "\n",
       "                          2                        3\n",
       "\\hat{w}[3, 3, 2]⋅x[2]⋅x[3]  + \\hat{w}[3, 3, 3]⋅x[3] "
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "elements = [[[term3d(i, j, k) for k in range(1, j + 1)] for j in range(1 + i)] for i in terms]\n",
    "simple_term = sum(extract(elements, []))\n",
    "simple_term"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAKIAAABNBAMAAADXzqJ/AAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAzXZUMhAiRGar792Zu4mlExrhAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEwklEQVRYCe1YTWhcVRQ+835mpmZmWruQbMSXYhYN0zpZRKFSOrpwUcU8oi6aRfIgi4pUEgpu2mLe0I1tFy1BqyDoUBRctVFRwU0CumgptqNSTBfSIVBpwdJoTWkq9HnOuT/vdfJCZt4bSlFPyL3f/c6559178965HwEgeyII7U9m0ja7giqneG3vkTN30ybj+RuCWZUnP1dRMFU/t6KnFzZpmAYMB76e/r1GaUA+uK2nGxqlAlf+jp9+KJ5ugx0N5uOizA9i6bjQVi4X3GqlaPw2/iS1m3fdpFPXmJcJuvPWhOntM/fCgUB22YEa7Fi1dnvLyf2LHDKyde92h1HIibnU7gqmwgGjklmHyzA9BWUeZtBvnEY4BseczwFZu5n/oge3hh7BsVtnKQSfaizABH4+d6DowQs8Nqn9Bn+vwk33aUC25JaWTQ8APZIjd2hzrdt2H3Gs21AIIwDsZRy58LjgbMg0pFdw7A7jJ78KsUDTnlGHUpTNzfJIV7yNjvYSJ92KG/AUUv15KJ6ACdh/goiR77ApzT+PA+svhMwOV5WHOeFGii1HYffbZehpQhOu0lZhfhCbzOG3lmHIWIJ+Yk33KTBc9giO3TrHcEVDBfrgQMOayr5CW7W969hufBe3dqu4lPWJna5cgdfZIzh2q8lgn9JQg8KF/plrAEWHmQVsd2+rgD3TX36H2T1bRs76yC4ojtzaMng+a9j4q+ygerctV6/KKMnSSFfCiBvgRxkY0w2W4E0XrHr2EvxkzTZlBLLSrLpCETeUwleH32QVQ/2e32C3D0bD+gweg5mqdCErzWgoFHHDUU+xcFijCKjQaa56lgiQ5xyJRhh5dXL1+108Mr3333ABP70YI89qm6wozr44r2Ckz8NHJwH8CBNC8qwy+7SiJj6WYkARCfvMH4+yfYtiZY0rrMPMF0PZE+gq0GGO/8O7fQLWJp2xrNDiubiXVnnX6a1zsxxhXqK7iGynW/ALDYbJGpMzmpvVqgb7odDMLyVLxrM4Y36zylBzCKVeo9FLaegu6vMJwWiVu2QNrjH3JU/Fu+hghZGhl5wkJ2a0b0zhTLqLxn4RKVLv2r5Ba6PKOfYzp8zGqknxtHVb8bem8+O7iI50tJq9s+68tQNQgJHVfBB3Ub4XejyjVVVxTHtN9vyKw5FDdEORma61eN1j+K9uzF/R8LvGb5qQ+9Bt9rlwRainhZXK74Vsp+ilD8WMnbhXoRmwrp2FHzrNE4l/ljHWMGlU1y7AcTVM0HPGmqNmyrqWdo30DQqlLeoa2J+oJyTocY2yhqHSlnUN+pwEmdQUzChqGCltUdfQlXbXsoYtoIDnugYQijX15PZ7/suI42M9jWeKpzjpt5+hNXIHE1jDUGkzrPnwNQwk/xT3zc1wHtNFpc0IhuDl7XEqU3g7aWP1dCcJWmPj9XRrVHtjUcNIT4d1rb2ZDygqrGYDTf3INOIsUs16ZHlMK874DQeqZuPiHUwtzjhjzcENH+RNM0wlziijqGa/W1sVRFnB6RM1mFFWs95nxt1uiDPMKBXZCq6rG+KMds3VzDpFuqwL4owyAlUzo3HAkjCdONPVrOi8yP8oSCvOwmqW8TY8Sev9r4iziCKLQD6Bzpt/AOi2UpjTJ5PgAAAAAElFTkSuQmCC\n",
      "text/latex": [
       "$$\\sum_{\\substack{1 \\leq i \\leq 3\\\\1 \\leq j \\leq 3\\\\1 \\leq k \\leq 3}} {\\hat{w}}_{i,j,k} {x}_{i} {x}_{j} {x}_{k}$$"
      ],
      "text/plain": [
       "  3     3     3                                  \n",
       " ___   ___   ___                                 \n",
       " ╲     ╲     ╲                                   \n",
       "  ╲     ╲     ╲   \\hat{w}[i, j, k]⋅x[i]⋅x[j]⋅x[k]\n",
       "  ╱     ╱     ╱                                  \n",
       " ╱     ╱     ╱                                   \n",
       " ‾‾‾   ‾‾‾   ‾‾‾                                 \n",
       "k = 1 j = 1 i = 1                                "
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Sum(term3d(i, j, k), (i, 1, 3), (j, 1, 3), (k, 1, 3))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$${\\hat{w}}_{1,1,1} {x}_{1}^{3} + {\\hat{w}}_{1,1,2} {x}_{1}^{2} {x}_{2} + {\\hat{w}}_{1,1,3} {x}_{1}^{2} {x}_{3} + {\\hat{w}}_{1,2,1} {x}_{1}^{2} {x}_{2} + {\\hat{w}}_{1,2,2} {x}_{1} {x}_{2}^{2} + {\\hat{w}}_{1,2,3} {x}_{1} {x}_{2} {x}_{3} + {\\hat{w}}_{1,3,1} {x}_{1}^{2} {x}_{3} + {\\hat{w}}_{1,3,2} {x}_{1} {x}_{2} {x}_{3} + {\\hat{w}}_{1,3,3} {x}_{1} {x}_{3}^{2} + {\\hat{w}}_{2,1,1} {x}_{1}^{2} {x}_{2} + {\\hat{w}}_{2,1,2} {x}_{1} {x}_{2}^{2} + {\\hat{w}}_{2,1,3} {x}_{1} {x}_{2} {x}_{3} + {\\hat{w}}_{2,2,1} {x}_{1} {x}_{2}^{2} + {\\hat{w}}_{2,2,2} {x}_{2}^{3} + {\\hat{w}}_{2,2,3} {x}_{2}^{2} {x}_{3} + {\\hat{w}}_{2,3,1} {x}_{1} {x}_{2} {x}_{3} + {\\hat{w}}_{2,3,2} {x}_{2}^{2} {x}_{3} + {\\hat{w}}_{2,3,3} {x}_{2} {x}_{3}^{2} + {\\hat{w}}_{3,1,1} {x}_{1}^{2} {x}_{3} + {\\hat{w}}_{3,1,2} {x}_{1} {x}_{2} {x}_{3} + {\\hat{w}}_{3,1,3} {x}_{1} {x}_{3}^{2} + {\\hat{w}}_{3,2,1} {x}_{1} {x}_{2} {x}_{3} + {\\hat{w}}_{3,2,2} {x}_{2}^{2} {x}_{3} + {\\hat{w}}_{3,2,3} {x}_{2} {x}_{3}^{2} + {\\hat{w}}_{3,3,1} {x}_{1} {x}_{3}^{2} + {\\hat{w}}_{3,3,2} {x}_{2} {x}_{3}^{2} + {\\hat{w}}_{3,3,3} {x}_{3}^{3}$$"
      ],
      "text/plain": [
       "                     3                        2                             2 \n",
       "\\hat{w}[1, 1, 1]⋅x[1]  + \\hat{w}[1, 1, 2]⋅x[1] ⋅x[2] + \\hat{w}[1, 1, 3]⋅x[1] ⋅\n",
       "\n",
       "                            2                                  2              \n",
       "x[3] + \\hat{w}[1, 2, 1]⋅x[1] ⋅x[2] + \\hat{w}[1, 2, 2]⋅x[1]⋅x[2]  + \\hat{w}[1, \n",
       "\n",
       "                                            2                                 \n",
       "2, 3]⋅x[1]⋅x[2]⋅x[3] + \\hat{w}[1, 3, 1]⋅x[1] ⋅x[3] + \\hat{w}[1, 3, 2]⋅x[1]⋅x[2\n",
       "\n",
       "                                   2                        2                 \n",
       "]⋅x[3] + \\hat{w}[1, 3, 3]⋅x[1]⋅x[3]  + \\hat{w}[2, 1, 1]⋅x[1] ⋅x[2] + \\hat{w}[2\n",
       "\n",
       "                 2                                                            \n",
       ", 1, 2]⋅x[1]⋅x[2]  + \\hat{w}[2, 1, 3]⋅x[1]⋅x[2]⋅x[3] + \\hat{w}[2, 2, 1]⋅x[1]⋅x\n",
       "\n",
       "   2                        3                        2                        \n",
       "[2]  + \\hat{w}[2, 2, 2]⋅x[2]  + \\hat{w}[2, 2, 3]⋅x[2] ⋅x[3] + \\hat{w}[2, 3, 1]\n",
       "\n",
       "                                       2                                  2   \n",
       "⋅x[1]⋅x[2]⋅x[3] + \\hat{w}[2, 3, 2]⋅x[2] ⋅x[3] + \\hat{w}[2, 3, 3]⋅x[2]⋅x[3]  + \n",
       "\n",
       "                     2                                                        \n",
       "\\hat{w}[3, 1, 1]⋅x[1] ⋅x[3] + \\hat{w}[3, 1, 2]⋅x[1]⋅x[2]⋅x[3] + \\hat{w}[3, 1, \n",
       "\n",
       "            2                                                          2      \n",
       "3]⋅x[1]⋅x[3]  + \\hat{w}[3, 2, 1]⋅x[1]⋅x[2]⋅x[3] + \\hat{w}[3, 2, 2]⋅x[2] ⋅x[3] \n",
       "\n",
       "                            2                             2                   \n",
       "+ \\hat{w}[3, 2, 3]⋅x[2]⋅x[3]  + \\hat{w}[3, 3, 1]⋅x[1]⋅x[3]  + \\hat{w}[3, 3, 2]\n",
       "\n",
       "          2                        3\n",
       "⋅x[2]⋅x[3]  + \\hat{w}[3, 3, 3]⋅x[3] "
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "full_term = summation(term3d(i, j, k), (i, 1, 3), (j, 1, 3), (k, 1, 3))\n",
    "full_term"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$$\\left({\\hat{w}}_{1,1,2} + {\\hat{w}}_{1,2,1} + {\\hat{w}}_{2,1,1}\\right) {x}_{1}^{2} {x}_{2} + \\left({\\hat{w}}_{1,1,3} + {\\hat{w}}_{1,3,1} + {\\hat{w}}_{3,1,1}\\right) {x}_{1}^{2} {x}_{3} + \\left({\\hat{w}}_{1,2,2} + {\\hat{w}}_{2,1,2} + {\\hat{w}}_{2,2,1}\\right) {x}_{1} {x}_{2}^{2} + \\left({\\hat{w}}_{1,3,3} + {\\hat{w}}_{3,1,3} + {\\hat{w}}_{3,3,1}\\right) {x}_{1} {x}_{3}^{2} + \\left({\\hat{w}}_{2,2,3} + {\\hat{w}}_{2,3,2} + {\\hat{w}}_{3,2,2}\\right) {x}_{2}^{2} {x}_{3} + \\left({\\hat{w}}_{2,3,3} + {\\hat{w}}_{3,2,3} + {\\hat{w}}_{3,3,2}\\right) {x}_{2} {x}_{3}^{2} + \\left({\\hat{w}}_{1,2,3} + {\\hat{w}}_{1,3,2} + {\\hat{w}}_{2,1,3} + {\\hat{w}}_{2,3,1} + {\\hat{w}}_{3,1,2} + {\\hat{w}}_{3,2,1}\\right) {x}_{1} {x}_{2} {x}_{3} + {\\hat{w}}_{1,1,1} {x}_{1}^{3} + {\\hat{w}}_{2,2,2} {x}_{2}^{3} + {\\hat{w}}_{3,3,3} {x}_{3}^{3}$$"
      ],
      "text/plain": [
       "                                                             2                \n",
       "(\\hat{w}[1, 1, 2] + \\hat{w}[1, 2, 1] + \\hat{w}[2, 1, 1])⋅x[1] ⋅x[2] + (\\hat{w}\n",
       "\n",
       "                                                     2                        \n",
       "[1, 1, 3] + \\hat{w}[1, 3, 1] + \\hat{w}[3, 1, 1])⋅x[1] ⋅x[3] + (\\hat{w}[1, 2, 2\n",
       "\n",
       "                                                  2                           \n",
       "] + \\hat{w}[2, 1, 2] + \\hat{w}[2, 2, 1])⋅x[1]⋅x[2]  + (\\hat{w}[1, 3, 3] + \\hat\n",
       "\n",
       "                                          2                                   \n",
       "{w}[3, 1, 3] + \\hat{w}[3, 3, 1])⋅x[1]⋅x[3]  + (\\hat{w}[2, 2, 3] + \\hat{w}[2, 3\n",
       "\n",
       "                             2                                                \n",
       ", 2] + \\hat{w}[3, 2, 2])⋅x[2] ⋅x[3] + (\\hat{w}[2, 3, 3] + \\hat{w}[3, 2, 3] + \\\n",
       "\n",
       "                          2                                                   \n",
       "hat{w}[3, 3, 2])⋅x[2]⋅x[3]  + (\\hat{w}[1, 2, 3] + \\hat{w}[1, 3, 2] + \\hat{w}[2\n",
       "\n",
       "                                                                              \n",
       ", 1, 3] + \\hat{w}[2, 3, 1] + \\hat{w}[3, 1, 2] + \\hat{w}[3, 2, 1])⋅x[1]⋅x[2]⋅x[\n",
       "\n",
       "                          3                        3                        3\n",
       "3] + \\hat{w}[1, 1, 1]⋅x[1]  + \\hat{w}[2, 2, 2]⋅x[2]  + \\hat{w}[3, 3, 3]⋅x[3] "
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "groupping = [x[a] *  x[b] * x[c] for a, b, c in combinations_with_replacement([1, 2, 3], r=3)]\n",
    "collect(full_term, groupping, exact=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Exercise 1.18\n",
    "By considering\n",
    "$$\n",
    "    \\prod_{i=1}^D \\int_{-\\infty}^{\\infty}e^{-x_i^2} dx_i = S_D \\int_{0}^\\infty e^{-r^2}r^{D-1}dr\n",
    "$$\n",
    "\n",
    "We can show that the surface area $S_D$ and the volume $V_D$ of a unit radius in $D$ dimensions is given by\n",
    "\n",
    "$$\n",
    "    S_D = \\frac{2\\pi^{D/2}}{\\Gamma(D/2)}\n",
    "$$\n",
    "\n",
    "$$\n",
    "    V_D = \\frac{S_D}{D}\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "D = np.linspace(0.1, 20, 1000)\n",
    "Sd = 2 * np.pi * D / gamma(D / 2)\n",
    "Vd = Sd / D"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA3cAAAFPCAYAAADuhTf/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4xLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvDW2N/gAAIABJREFUeJzs3Xl4lOW9B/zvM2smmewzWSBkTyDsAWQTRFAKIrgjiCdWUNt6PIfanlqrpXbBqm2vc9nqW5f6Htu+Wtxq3a2tigs7AcIWAiQkZE8mezKZSTLL8/6RTGTJnpl5nmfm+7muXlcTZub5ziTOnd/c9/27BVEURRAREREREZGiqaQOQEREREREROPH4o6IiIiIiCgAsLgjIiIiIiIKACzuiIiIiIiIAgCLOyIiIiIiogDA4o6IiIiIiCgAsLgjIiIiIiIKACzuiIiIiIiIAoBG6gBEFNja2towf/58hIaGAgAiIyMxc+ZM/Nd//Reys7MlTkdEROQdHO9IDjhzF0COHj2KvLw8rFu3DmvXrsW9996L4uLiUT/Oz3/+c6xYsQJPP/20D1JezOFwYMmSJbj33nt9fi3Av8/tQidOnMDWrVsBAFu2bEFzc7NXHvfAgQNYu3atVx5rOBc+h9EoKipCVFQUCgoKUFBQgHfeeQeTJ0/G7bffjnPnzg15308++QR5eXnjur63SH19IvKPvLw8/OlPf7rs+y+//DLuv//+Qe/nz/fjkZJizLv0vdJbY56/X9+xvOePZ7wDOOaRl4gUELq7u8X58+eLJ0+e7P/eu+++Ky5btkx0Op2jeqzJkyeLtbW13o44oI8++ki85557xAULFoglJSU+v54/n9tgsrOzxaamJq881v79+8Xrr7/eK4/lK3/+85/Fu+6667Lv33HHHeJTTz015H3/+c9/iv/xH//hq2hERJf5+OOPxW9961uXfX/VqlXirl27Br2fHN+PA2nMk+Pre6nxjHeiyDGPvIMzdwHCbrejo6MDNput/3s33HADfvazn8Hlcl32iZfn6wMHDuCGG27Axo0bsW7dOmzYsAGiKOK+++7DoUOH4Ha78fjjj2P9+vVYs2YNrrvuOhw+fBgA8Pe//x3XX3891q1bh7vuugu1tbUAgJ07d2L9+vW46aabsHHjRhQUFAya+7XXXsM111yDNWvW4K9//etF+S7M1dPTM+jjDpXxQps2bbroub3xxhtYu3YtbrjhBmzZsgVlZWWDXvvS122grw8cOICNGzfioYcewk033YS1a9f25/Dc7pFHHgEAfPvb3+5/vTw6OzuxdetW3Hjjjbj55puxbds2uN1uHDhwAOvXr8f3v/99rFu3DuvXr7/oE0CbzYYf/OAHuPHGG7F69WocOnRoyJ/DaF7bC430uV7q1KlTyMnJuez76enpsFgsl33/D3/4A6699lrcdttt+PTTTwe9/oYNG/Dggw/ixhtvxMaNG7Fz505s3rwZV199NZ544on++w303IbKP9TP4cKf/UC/P2N5XCKSl5UrV8Jms/W/lwLAwYMHIYoirrzySgAD//d/oeHGivG8fw1koDyXjnkXGum4OZYx78LbeHvMG2y8G+q1Gu+Y58vxDhh+zPPG78t4x7yh/l7imCdD0taW5E0vv/yyOHPmTHHFihXij370I/Gtt94SbTabKIqXf+Ll+Xr//v3ilClTxKqqqv5/u/BTtiNHjoj//d//LbpcLlEURfHFF18Uv/vd74pFRUXiggULxJqaGlEUez+t+tnPfiaWlZWJa9euFZubm0VRFMWzZ8+KV155pdjZ2XlZ3uLiYnHatGlic3OzeOzYMXHmzJn997s011CPO1jGgXie2969e8Vrr722/3m+/fbb4nXXXSe63e4BX5NLX7eBvt6/f7+Yk5Mjnjp1ShRFUfy///s/8c4777zsdoN9ivnOO++IW7ZsEUVRFJ1Op/jTn/5UPH/+fH+e/Px8URRFcceOHeLNN9980TWPHj3a/3O46667hny9RvPaDvbch3qul1q7dq34zjvvXPb9rVu3itu3b7/oe59++qm4Zs0asaOjQ3Q4HOJ3vvOd/k8xB7p+YWGhKIqieM8994gbNmwQu7u7xaamJnHatGliXV3doM/tiy++GDT/UD8Hz/UH+/3Zt2/fqB+XiOTnmWeeER9++OH+r3/4wx+Kf/nLX0RRHPq//wvfo4YbK8b6/nXpe/NQ49lg481Ix82xjHmX3sdbY95g450oDj2OjXfM89V4J4ojG/O88fsy1HMYbswb7u8ljnnyw4YqAWTz5s1Yv3498vPzkZ+fj5deegkvvfQS/v73vw95v8TEREycOHHAf8vNzUVkZCRef/11VFZW4sCBAwgLC8O+ffuwZMkSJCYmAgDuvvtuAMDf/vY3WCyW/q8BQBAEVFRUYMqUKRc99muvvYbly5cjOjoa0dHRSEpKwptvvonvfve7l+Xas2fPoI87WMah7Nq1C2vWrEFMTAwA4JZbbsGvf/1rVFVVDfuaDGXChAn9n9pNnToV77zzzojvO3fuXDz99NPIy8vD4sWL8e1vfxspKSmoq6vDlClTMG/ePADArbfeil/96ldoaWkBAEyaNAmzZs0CAEyZMgVvv/32kK/Xpc9vqNte+jMb7XPt6elBaWnpZY/jcrlQUFCAbdu2XfT9ffv2YeXKlTAajf3P9ZVXXhnw+klJSZg6dSoAIDk5GeHh4dDpdIiJiUFYWBja2tqQn58/4HMrLy8fNP9QPwePwX5/qqurR/24RCQ/t99+O66//npYrVY4nU7s3r0bv/jFLwAM/d//SI3n/evS9+bhxrOBjGXcHIg/x7zW1tYBxztg6HEMGP+Y54vxDhj5mDfe35ehnsNwY95wv18c8+SHxV2AOHz4MAoKCnDvvfdi+fLlWL58OX74wx9i7dq12LNnD2JiYiCKYv/tHQ5H///3dHUayJdffolf//rX2Lx5M6655hqkp6fj/fffh1qthiAI/bfr6upCdXU13G43Fi1ahN///vf9/1ZbW4u4uLiLHtdms+G9996DTqfDihUrAABWqxWvvvoqtmzZclmuoR53sIxDGWhpgCiKcDqdQ74mgiAM+joCQEhIyKC3Hc6kSZPw6aef4sCBA9i/fz82b96MX/3qVwgLC4Narb7s9p7vabXay6451Ot16NChEb+2QxnJcz179iwEQUBGRsZF33/99deh1WqxfPnyy+5z4eMM9Lw9dDrdRV9rNJe/nQ323M6fPz9o/qF+Dhc+7kC5nU7nqB/X8/tPRPIRHx+PxYsX4+OPP4bNZsOqVasQHh4OYPjxAxh+rBjP+9el780jyXOpkY6bchvzBhrvgKFfK2+Meb4a74CRjXnj/X05dOjQmMe84X6/OObJD/fcBYiYmBg8//zzF60/b2hogNVqRXZ2NmJiYlBTU4OmpiaIooiPPvpoRI+7Z88eLF++HJs2bcL06dPx2WefweVyYcGCBdi3b1//GvLXX38dv/vd77Bo0SLs2bOnf338V199hRtuuAFdXV0XPe4HH3yAqKgo7Nq1Czt37sTOnTvx2WefwWaz4ZNPPrksx1CPO1jGoSxduhQff/xxfwevt99+G1FRUcN+qjTW1/FCarV6wEF3x44deOSRR7BkyRI89NBDWLJkCU6dOgUAOH36NE6fPg2gd+17bm4uIiIiBr3GSH8Oo73taBUVFSErK6t/QK6trcXTTz+NZ555Bk8//fRFAzUAXHXVVfjkk0/Q3t4Ot9uN9957b1zXH8tzG+rn4DHY709ycvK4HpeI5OPOO+/EBx98gHfffRd33nln//dH8t+/N8aKkb5/jWU8G+m4Kacxz1NcD0QOY95oxzvAu2PeWJ/XcGPTWP9e4pgnHc7cBYi0tDT88Y9/xNNPP426ujro9XqEh4fjiSeeQHp6OgBg48aNuPXWW2E2m3H11VfjxIkTwz7uxo0b8T//8z9Yt24dnE4nrrzySvz73/9GVlYWHnroof4jDMxmM5544gnEx8fjV7/6FX74wx9CFEVoNBo8//zzly33eO2117B58+aLPqWKiIhAXl4e/vKXv+DHP/7xRbfPzMwc9HEHy+h2u6FSDfz5xZVXXom7774b3/72t+F2uxETE4MXX3xx0NtfmGMsr+OFVq9ejby8PDz77LMXnXtz00034eDBg1izZg0MBgMSExORl5eH06dPw2Qy4fe//z2qq6sRExOD3/72t8PmHMnPYbS3Ha2ioiKcOXMGubm50Gg0iImJweLFi/H2228jKSnpstsvW7YMZ86cwa233oqIiAhMmTKlf/npWAz23IYq/of6OXgM9vszVLvvwR6XiORpwYIFePzxxxEZGYnJkyf3f38k//17Y6wY6XvzWMazkY6bchrzhlr2Kocxb7TjHeDdMW+sz2u4MW+sfy9xzJOOII5mDp2I/O7AgQPYvn07PvzwQ6mjEBER+RTHPKLx4bJMIiIiIiKiAMCZOyIiIiIiogDAmTsiIiIiIqIAwOKOiIiIiIgoALC4IyIiIiIiCgCKOgqhoaFjXPcPDdXBZuvxUhrfUlJWQFl5mdV3lJRXSVkBZeX1VlazefBzrehy4xkjlfT7BSgrr5KyAsrKy6y+o6S8SsoKeCfvUONjUM3cqVSC1BFGTElZAWXlZVbfUVJeJWUFlJVXSVmpl9J+ZkrKq6SsgLLyMqvvKCmvkrICvs8bVMUdERERERFRoGJxR0REREREFABY3BEREREREQUAFndEREREREQBgMUdERERERFRAGBxR0REREREFABY3BEREREREQUAFndEREREREQBgMUdERERERFRAND44yIOhwOPPvooqqur0dPTg/vvvx8JCQn43ve+h9TUVADAHXfcgTVr1vgjDl3A6XKjuLIV5fVWdPU4ERWuR05yNOJjQqWORkRENCIOpwuFZS2oarBCFEVMMIVhWloMQnR++TOHiEg2/PKu9/777yMqKgq/+93v0NLSgptvvhkPPPAANm/ejC1btvgjAl1CFEXsOl6L93aXoaWj+7J/z0mJxvrlGUhNiJAgHRER/eMf/8A777wDAOju7kZRURH27NmDiAi+L3u4RRFfHa3Bu7tK0WFzXPRvep0aq66YhDULU6DTqiVKSETkX34p7lavXo1Vq1b1f61Wq3Hy5EmUlZXh888/R0pKCh599FEYjUZ/xAl6ti4HXvrgFI6da4JOq8Ly3ImYmhqNUL0G9a12HDxVj6LyFmz/6yGsXZSKG5emQSUIUscmIgoqt9xyC2655RYAwC9/+UvceuutLOwu0ONw4aUPTuHw2QYY9Gqsnp+MyclREAQB56rb8PWxGry/5zyOlTThgVumwxRpkDoyEZHPCaIoiv66mNVqxf3334/bb78dPT09mDx5MqZPn47nn38e7e3tePjhh4e8f2dnN1SqsRcZWq0aDodrzPf3J19ltdp68Phf8lFa044ZGbF44NaZiIkIuex2J8414sV3T8LSYsfC6QnYetssaDSDb9Hka+sbSsoKKCuvkrICysrrrawGg84LaZTvxIkT+O1vf4tXXnllyNs1NHSM+RpGox5W6+WrOOQqxKDFE3/Nx8nSZkyeFIXv3DAN0eH6i27T1ePEa58VY9fxWkQadfjJpjmSbDlQ2murpLzM6jtKyqukrIB38prN4YP+m98Wo9fW1uKBBx7Apk2bsG7dOrS3t/d/Arly5Ups37592Mew2XrGlUFJP3xfZHU43fjta0dQWtOOJTMTcffqKVCphAGvkxYfjm13zcP/848T2H+yDk6HC9+9cRrUqoELvGB/bX1FSVkBZeVVUlZAWXm9lZXFXa8XX3wRDzzwgNQxZOXlD0/hZGkzZqTH4r9umQHtAB8+hug02LwmBxNMYXhjZwl++1oBfpo3d8APNImIAoVfirvGxkZs2bIFjz32GBYtWgQAuOeee/Czn/0MM2fOxL59+zBt2jR/RAlqr/77DM5Vt2PB1Hjcfd2UYZdaGg1a/OD2WXj6zWM4dKYBkZ+X4M6V2X5KS0RE7e3tKC0txcKFC4e9bWiobsyrW7RaNYxG/fA3lIH9J2vxWX4lUhPD8dCdcxCiH/pPmVtXZEGtUWHHv8/i+fcK8ct7F/h1D56SXltAWXmZ1XeUlFdJWQHf5/VLcffCCy+gvb0dzz33HJ577jkAwE9+8hM88cQT0Gq1MJlMI5q5o7HLP23BruO1SIkPx+YRFHYeeq0a379tJp549TA+P1yF9AkRWDQtwcdpiYgIAPLz87F48eIR3XY8q1uUMjPc1tmDP71XCJ1Whe+smwanwwXrCJYAX5M7Eedr2rH3ZB3+74NC5H1rsh/S9lLKa+uhpLzM6jtKyqukrIB38g61ssUvxd22bduwbdu2y77/+uuv++PyQa/d1oNX/30GWo0K371x2qg/sTToNXjg5hnY/td8/PWfp5ESH44JpjAfpSUiIo+ysjIkJSVJHUM23v7qHKx2B+6+PgcJo9g/JwgC7lo1GeV1HfjiSDXmZJsxLTXGh0mJiKTBQ8yDwNtfnkOHzYFbr0of1WB4oYSYUGy+Lgc9Tjde/rgIbrff+vAQEQWte++9F3fffbfUMWShor4De47XIskchtULUkZ9f51WjXvW5kAlCPjzx0Wwdzt9kJKISFos7gJcpcWK3cdrMdEchmvnTRrXY82bEoeFU+NRWtOOf+dXeikhERHR8N768hxEABtWZI15b2FqQgSuX5SC5vZuvLe7zLsBiYhkgMVdgHvzi5LewXB55riOkfDYtDIbEaFavLOrFI2t9vEHJCIiGkZZbTsKy5oxJTkK09LGt5xy7eIUmCJD8PnhKtQ2dXopIRGRPLC4C2BF5S0oLGvGtLQYTE+P9cpjGg1abLgmCw6nG29+UeKVxyQiIhrKR/vKAQBrF6eO+7G0GjU2rMiEyy3ijZ0cx4gosLC4C2Af7zsPALh5abpXH3fh1HhkTIzAoTMNOF3e4tXHJiIiulBdsw1HzjYgfUIEclKivfKYc7LNmJIchePnmnCmguMYEQUOFncB6nxdOwrPtyAnJRrpEyK8+tiCIGDTtdkQALy+sxiiyOYqRETkG18drQYArJw3CcIIj/EZjiAIuHVZBgDg3V3ce0dEgYPFXYD6eH8FAGDNwtF3FBuJtMQIzJ8aj4p6K46cbfDJNYiIKLg5nC7sPl6L8FAt5k42e/WxMyZGYkZ6LM5UtqKIq1CIKECwuAtAze1dOHzGguQ4I6amemcJy0BuuDIVgtD7qSePRiAiIm87dLoBnV1OLJmZCI3a+3+y3LgkDQDw3q5SrkIhooDA4i4AfX2sBqIIrJib5LUlLANJjA3D4ukJqG7sxN4TtT67DhERBacv+5ZkLps1wSePnz4hAjMzYnG2qg1nK1t9cg0iIn9icRdgnC43vjpWA4NejQU58T6/3g1XpkGtEvD2lyVw81NPIiLyksZWO4qr2jAlOQpx0aE+u45n+8K/DvL8ViJSPhZ3AeZYSRParD1YPC0Rep3a59czRxmwcGo8qhs6cayk0efXIyKi4HDwtAUAsHBagk+vk5UUibTECBwraURds82n1yIi8jUWdwHm62M1AIBlub5ZwjKQVQuSAQCfHKjw2zWJiCiwHThVD7VK8HojlUsJgoBV8ydBBPBpPmfviEjZWNwFkPbOHhSWNSM1IRxJZqPfrptkNiI324ziqjaUVLX57bpERBSYaho7UWmxYkZ6LMJCtD6/3tzJZsRGhGDPiVp02Hp8fj0iIl9hcRdA8k9b4BZFny9hGciNS3s7jv3zQLnfr01ERIHlYFE9AGD+1Di/XE+tUmHlvCT0ON3Yc6LOL9ckIvIFFncBZH9hHQQBmJ/jn8HwQjmpMUhLDMfRYu5ZICKi8TlythEatYBZGSa/XXPxjERoNSp8ebSaDcKISLFY3AUIS6sd52rakZMSjSij3u/X792zkAwRwBdHqv1+fSIiCgyNbXZUNViRkxIDg17jt+saDVrMnxIHS4udh5oTkWKxuAsQBwp7l5EsnOr/JZkec7LNiAzTYfeJWnT3uCTLQUREynWspAkAMDvLf7N2HlfPmQgA+LKAH1ISkTKxuAsQB09boFGrfN5VbCgatQpXzZoAe7cTB/r2SxAREY3G0eIGAMCsjFi/Xzs9MQLJcUYUnG1ES0e3369PRDReLO4CgKXFhuqGTkxLjfbrEpaBLJs9ASpBwM7DVRC5Z4GIiEbB1uXE6YpWpMSHIyYixO/XFwQBV+dOhFsUsft4jd+vT0Q0XizuAkBBce/h4bnZ0s3aecREhCA3y4QKixXnatqljkNERApy6nwzXG4RszL9P2vnsWBqPPRaNXafqOWHlESkOCzuAkDB2QYIAGZn+n9/wkBW9O1ZYGMVIiIajcLzzQCAGRIsyfQw6DWYO9mMhtYuFPPsViJSGBZ3Ctfe2YPi6jZkJkUiIkwndRwAwJSUaMRFG3D4jAW2LqfUcYiISCFOnW+GQa9BakK4pDmunN7bnGzvyVpJcxARjRaLO4U7VtIIUQRys6RfkukhCAKWzkxEj9ONg6fZWIWIiIZnabWjobULOSnRUKuk/fNkcko0YiP0yD9tQY+D3Z+JSDlY3CncN/vt5LEk02Px9EQIArD7OD/1JCKi4Z3qW5I5NTVa4iSAShCwaHoC7N0uHOnr3klEpAQs7hTM4XTjVHkzEmNDER8dKnWci0SH6zEjPRalNe2obrBKHYeIiGTu1Pneg8OnpsZInKTX4umJAIC9J+okTkJENHIs7hSsuKoVPQ43ZqRLt/F8KEtm9A6Mu09w9o6IiAbnFkUUnW9GbIQe8dEGqeMAABJiQpExMQKF55t55h0RKQaLOwU7Wda7hGV6mjw+5bzU7CwTjAYt9p6sg9PlljoOERHJVGW9FZ1dTuSkxkAQBKnj9LtyeiJEEdh/irN3RKQMLO4U7GRpM7QaFbInRUkdZUAatQqLpiWgw+bAsZImqeMQEZFMFZX3LclMkX6/3YXmTYmDWiXgYJFF6ihERCPC4k6hWjq6UdVgRfakKOi0aqnjDOrKGb3tpPcX8lNPIqLRePHFF7FhwwbccssteOutt6SO41NnK1sBQHYfVhoNWkxLi0F5XQfqm21SxyEiGhaLO4UqlPmSTI9JcUZMNIXh2LlG2LocUschIlKEAwcOoKCgAK+99hpeeeUV1NUF7gdkblFESXUbTJEhiIkIkTrOZebnxAEADhbxaB8ikj8Wdwp1sqx3maPciztBELBwWjycLhGHzrCdNBHRSOzevRvZ2dl44IEH8L3vfQ9XX3211JF8prbJBqvdgaykSKmjDCg3ywyNWoUDRRaIoih1HCKiIWmkDkCj53aLOHW+BdHhekwwhUkdZ1gLpsbj7a9Ksb+wDlfNmiB1HCIi2WtpaUFNTQ1eeOEFVFVV4f7778cnn3wyZLOR0FAdVKqxNSPRatUwGvVjjTsulX0zYjMyTSPO4M+8RqMecyabcfBUPVo6HUhOCB/V/aV8bcdCSXmZ1XeUlFdJWQHf52Vxp0Dl9R2w2h1YMjNRVl3FBmOKNCArKRJnKlrR3N4ly2U3RERyEhUVhfT0dOh0OqSnp0Ov16O5uRmxsYMffWOz9Yz5ekajHlarNO3+T5Q0AgAmmY0jzuDvvHOze4u7Lw5X4tZlGaO6r5Sv7VgoKS+z+o6S8iopK+CdvAaDbtB/47JMBTpdIc+uYkNZNC0BIoAD3LNARDSsuXPnYteuXRBFEfX19bDb7YiKklezEW8prmqD0aDFhNhQqaMMamZGLPRaNQ4W1XNpJhHJGos7BTpT0dtVbHKycoo7Tzvp/YUs7oiIhrN8+XLk5OTgtttuw/3334/HHnsMarV8OyOPVXN7FxrbupA5MVLWK1H0WjVys0xoaO3C+boOqeMQEQ2KyzIVxuV2o7iqFfExoYgOV876YqNBixnpsTha0ojqBismmo1SRyIikrUf//jHUkfwueKqNgBA1iR5NlO50PyceOw/VY+DRfVIS4yQOg4R0YA4c6cwFfVW2LtdmCyzs4BGYuG0eADA/lOcvSMiIuBcdV9xN1H+Y9q0tBiE6NQ4fKaBSzOJSLZY3CmMZ0nmlGT5D4SXmpVpgl6rRv5ptpMmIiKgrLYdapWA5Hj5r+bQalSYlWlCY1sXKuqtUschIhoQizuF8TRTUdJ+Ow+9Vo1ZmbGwtNg5MBIRBTmny43yeiuSzEbotMrYTzg32wwAOHzWInESIqKBsbhTkP79dtEGRe23u9AVU3qXZuaf5sBIRBTMqhqscLrcSJugnP1rM9JjodWocPhMg9RRiIgGxOJOQfr32ylw1s5jRnoM9Do18k+znTQRUTArq2kHAKQlju5QcCnpdWpMT4tBbZMNNY2dUschIrqMX7plOhwOPProo6iurkZPTw/uv/9+ZGZm4ic/+QkEQUBWVhZ+/vOfQ6VirTmUb45AUN5+Ow+dVo3ZmSYcOFWP8voOpCYo5xNbIiLyntLa3uIuXWGdJ+dNjkNBcSMOn7FggilN6jhERBfxSzX1/vvvIyoqCjt27MBLL72E7du348knn8SDDz6IHTt2QBRFfP755/6IomhnK/uKOwV2yrzQFVPiAAD5RVyaSUQUrMpqO6DXqZEYGyZ1lFGZlRkLtUrA4bNcmklE8uOX4m716tX4/ve/3/+1Wq1GYWEh5s+fDwC46qqrsHfvXn9EUSxRFFFS3QZTZAhiIkKkjjMu3yzNZNdMIqJgZO92oraxE2kJ4VCp5Ht4+UBCQ7TISY1GRb0Vlla71HGIiC7il2WZYWG9n8pZrVZs3boVDz74IH7zm99AEIT+f+/o6Bj2cUJDdeMaBLRaNYxGZTQiuTRrTWMnrHYHZmeZZPkcRvvaXpETj93HamBp70bGRP8eXqvk3wO5U1JeJWUFlJVXSVlJGufrOiACSFXYkkyPudlmnCxtxpEzDVi9IFnqOERE/fxS3AFAbW0tHnjgAWzatAnr1q3D7373u/5/6+zsRETE8G/wNlvPuDIYjXpYrd3jegx/uTTr8b7lHynx4bJ8DqN9bXMzY7H7WA2+OlKF+Ej/zkQq+fdA7pSUV0lZAWXl9VZWg0HnhTQkR2UK3W/nkZtlxv/3rzM4fNbC4o6IZMUvyzIbGxuxZcsWPPTQQ7jtttv3+XyaAAAgAElEQVQAAFOnTsWBAwcAAF9//TXmzZvnjyiKVVLdBgDI9PMsl69MT4uBQa9GfhGXZhIRBZtvOmUqs7iLCNMhOykK56rb0dKhjA9diCg4+KW4e+GFF9De3o7nnnsOeXl5yMvLw4MPPohnn30WGzZsgMPhwKpVq/wRRbHOVbdBr1UjKU5ZG88Ho9WoMTvTjKb2LpTVDr8kl4iIAkdZXTsiQrWIiVDu8t25k3sPNC8oZmMVIpIPvyzL3LZtG7Zt23bZ91999VV/XF7xbF0OVDd2IiclGuoAOi7iiilx2FdYh8NnLEhX0CG2REQ0dh22HjS3d2NGemz/3nslmp1lwo7PinG0uBEr5iRJHYeICAAPMVeEc33LV/zdeMTXpqVFQ69V4/DZBi7NJCIKEhUWKwAgOd4ocZLxMUUakBxnRFF5C+zdTqnjEBEBYHGnCCVVgbXfzkOrUWNGRiwsLXZUN3ZKHYeIiPygor53KX5yfLjEScZvdpYJLreIk2XNUkchIgLA4k4RPM1UMiYG3tLFudm9exaOnOGeBSKiYFBZHxgzd0Bv10yA++6ISD5Y3Mmcy+1GaW07JpjCEBailTqO183MiIVGLeDwWQ6MRETBoLy+AyE6NcxRBqmjjFtyvBHR4XocL2mC0+WWOg4REYs7uatu6ER3jwuZAThrBwAGvQZTU2NQabHC0mqXOg4REflQt8OFumYbJsUZoVJwMxUPQRAwO8sEW7cTxX1bKIiIpMTiTub6l2ROCKz9dheaw6WZRERBoarBClEMjP12HrlZJgBcmklE8sDiTuY8B72mB1gzlQvNzjJBEIAjXJpJRBTQ+vfbxSl/v53HlORohOjUOFrcyM7PRCQ5FncyV1rbDr1OjcSYUKmj+ExEqA6TJ0WhpLoNrdZuqeMQEZGPBFKnTA+NWoUZ6bFobOtCdQM7PxORtFjcyZi924m6JhtS48OhUil/b8JQcvuWZhZw9o6IKGBVWKxQqwRMMIVJHcWruDSTiOSCxZ2Mldd1QASQlhiYzVQu5DkSgV0ziYgCk9stospixQRTGLSawPrzY0ZGLFSCgKMljVJHIaIgF1jvrgGmrK53v13ahMAv7mIiQpCWGI4zFa2w2h1SxyEiIi+ra7ahx+kOqP12HmEhWkxOjkJZbQdaOri9gIikw+JOxspqe/cmpCUEzt6EoczJNsPlFnGMn3wSEQWcCkvvmDYpgPbbXWh239JMzt4RkZRY3MnY+dp2GA1axEaGSB3FL/qPRODSTCKigONpNjLJHFj77TxyM/uKu2IWd0QkHRZ3MtXe2Y3Gti6kJUZACICDXkciMTYME0xhOFnWjK4ep9RxiIjIizzF3URz4C3LBABTlAFJZiOKypth7+YYRkTSYHEnUyVVvYeXpyUG5vKVwczJNsPhdONkabPUUYiIJHfTTTchLy8PeXl5eOSRR6SOMy7VjVaEh2oREaaTOorP5GaZ4HSJKCzjGEZE0tBIHYAGdq7aU9wFfjOVC83NNuPDvedx5GwD5k2JkzoOEZFkurt7G3O88sorEicZv+4eFxpau5CTEi11FJ+anWXCB3vPo6C4kWMYEUmCM3cyFazFXXK8EbERITh2rglOl1vqOEREkjl9+jTsdju2bNmCu+66C0ePHpU60phVN/YtyQyw8+0ulZoQjiijDidKm+BycwwjIv/jzJ0MiaKIc1VtiI3QB/TylYEIgoDcbBM+O1SF0+UtmJ4eK3UkIiJJhISE4J577sH69etx/vx53Hffffjkk0+g0Qw8dIeG6qBSjW2PtlarhtGoH0/cITV2dAEA0pOivHIdX+cdj3k58fgsvxI1zXbkpMbIOutAlJSXWX1HSXmVlBXwfV4WdzLU3N6Nts4ezJ1sljqKJOZmm/HZoSocOdvA4o6IglZaWhpSUlIgCALS0tIQFRWFhoYGJCYmDnh7m61nzNcyGvWwWn13Pltp3z5yU4R3ruPrvOMxPTUan+VXYt/xWkwyhck660CUlJdZfUdJeZWUFfBOXoNh8MkfLsuUobLavsPLg2xJpkdWUhSMBi0KihvhFkWp4xARSeLvf/87nnrqKQBAfX09rFYrzGZlfuhX3WAFEPjLMgEgJyUaOq0KBTzvjogkwOJOhsrq+oq7IDm8/FIqlYDZWSa0dfagtLpd6jhERJK47bbb0NHRgTvuuAM/+MEP8MQTTwy6JFPuqho7ERuhh0GvzPyjodWoMT0tFvXNNtQ2dUodh4iCTOC/yypQRV0HACAlSIs7oPdIhN3Ha3HkbAMykyKljkNE5Hc6nQ7/+7//K3WMcbPaHWiz9mBmRvAss5+dacKRsw04WtKIrJQYqeMQURDhzJ3MiKKI8nor4qMNCA3RSh1HMtNSo6HXqXHkbANELs0kIlKs/iWZ5sBfkukxMzMWAoCjxVyaSUT+xeJOZlo6umG1O5A2Ibhnq7QaNWakx8LSakd1A5e1EBEpVVXfe3iSyShxEv+JCNUhIykSJdVtaO9UTqMHIlI+FncyU963JDM1SJupXGhOtgkAcORsg8RJiIhorPrPuAuimTsAyM00QRSBI2c4hhGR/7C4k5ny+t7iLn0Ci7uZ6SaoVQKLOyIiBatusEIQgMTYUKmj+NXsrN4PKA+dtkichIiCCYs7mamo792bkMriDqEhGuSkRqPCYkVDq13qOERENEqiKKK6oRPx0aHQatRSx/GrhJhQxEcbcKykEQ6nS+o4RBQkWNzJTHl9B6KMOkT58OR6JZmT3XumUwFn74iIFKfV2gNbtzPolmQCgCAImJVpQnePC6crWqWOQ0RBgsWdjLTbetDS0Y3k+OA9AuFSuVlmCOC+OyIiJarpO+dtQmzwFXcAkNu3NJNdM4nIX1jcyUhF3367FBZ3/SLDejuOFVe1ob2zR+o4REQ0CnVNNgDBt9/OIzMpEmEGLY6WNPJYHyLyCxZ3MuLplMmZu4vNyTJDBHC0hJ98EhEpiWfmLjFIZ+7UKhXmZJvR0tHdv6eeiMiXWNzJiOeNPyUheM4CGok5k3v33XFpJhGRsnhm7hJignPmDgDm5cQBAAqKOYYRke+xuJOR8voOhIVoEBsRInUUWYmLMiDJbMSp882wdzuljkNERCNU09SJ2Ag99Lrg6pR5oVmZvcf6cPUJEfkDizuZsHc7YWmxIzk+HIIgSB1HduZkm+B0iThR2iR1FCIiGgFblxNt1p6gXZLpERqixZSUaFTUW9Hc3iV1HCIKcCzuZILNVIbmORKBSzOJiJShrrlvSWaQNlO50OzMvq6ZnL0jIh9jcScTnv12ydxvN6BJcUaYIkNw/FwTHE631HGIiGgYtUF+DMKF+os7HolARD7G4k4myjlzNyRBEDAn24yuHheKypuljkNERMOoDfJjEC4UGxmC5DgjispbuHeciHyKxZ1MVNR3QK9VIz6ag+BguDSTiEg5aoP8GIRLzc4yweUWUVjGDyiJyHdY3MmAw+lCTaMNk+KMUKnYTGUwmRMjERGqRUFxI9xuHgZLRCRntU02hIVoEB6qlTqKLMzivjsi8gMWdzJQ02iDWxQxKZ777YaiUgmYnWVGh82Bkuo2qeMQEdEgnC43LC12JMaGsQN0n5SEcEQZdTh+rgkuN/eOE5FvsLiTgQpL7367SWYWd8Ph0kwiIvmztNjhFkV2yryAShAwO9MEq92Bc9XtUschogDl1+Lu2LFjyMvLAwAUFhZi6dKlyMvLQ15eHj7++GN/RpGVKkvvvoRJcSzuhpOTEo0QnRpHzjZAFLk0k4hIjtgpc2Czs9g1k4h8S+OvC7300kt4//33YTAYAACnTp3C5s2bsWXLFn9FkK1KSwcEABPNHASHo9WoMDMjFgeLLKi0WJHM7qJERLLj6ZTJmbuL5aREQ6dVoaCkEbevyJQ6DhEFIL/N3CUnJ+PZZ5/t//rkyZP48ssvceedd+LRRx+F1Wr1VxRZEUURVQ2dMEcbEKLzW62taFyaSUQkb990ymRxdyGtRo3pabGob7b1v0ZERN7kt2pi1apVqKqq6v965syZWL9+PaZPn47nn38ef/zjH/Hwww8P+RihobpxdZPUatUwGvVjvr8vNLd3wWp3YGpazEXZ5Jh1KP7Mu2jmBPzfR0U4WtKE/7guZ9T3V9Jrq6SsgLLyKikroKy8SspKvlHbZINGLcAcaZA6iuzMzjThyNkGHC1p5DERROR1kk0VrVy5EhEREf3/f/v27cPex2brGdc1jUY9rNbucT2Gt53uO+9mQkzoRdnkmHUo/s6bkxKN4+eaUFrZgrhRng2opNdWSVkBZeVVUlZAWXm9ldVg0HkhDfmbKIqobbYhPiaUx/sMYGZmLAT07ru7bkGK1HGIKMBI1i3znnvuwfHjxwEA+/btw7Rp06SKIqnKvk6ZSWymMirfLM3kpnQiIjlp6ehGd4+Ls1KDiAjVISMpEiXVbWgf54fWRESXkqy4+8UvfoEnnngCeXl5OHLkCP7zP/9TqiiSqmroXXPP4m50ZmeaIAjAkWLuuyMikpO65r5mKjHcbzeY3EwTRBE4ca5J6ihEFGD8uiwzKSkJb775JgBg2rRpeP311/15eVmqslgRolPDFBkidRRFiQjTIWtiJIqr2tDW2YPIMC7fIiKSg/q+4i6Rxd2gZmeZ8NaX53C0uBFXzkiUOg4RBRAeYi4hh9OF2iYbksxGqATuSxitOdlmiAAKOHtHRAGqqakJy5Ytw7lz56SOMmL1LXYAQFwMm6kMJiEmFPHRBpwsa4bD6ZI6DhEFEBZ3EqpptMEtijy8fIx4JAIRBTKHw4HHHnsMISHKWtnhWZYZP8pmV8FEEATMyjSh2+HC6YpWqeMQUQBhcSehSkvv2X7cbzc2pigDkuOMKDrfAluXU+o4RERe9Zvf/AYbN25EXFyc1FFGpb7ZBqNBC6NBK3UUWcvNMgHo7ZpJROQtPDVbQlUNvcUdZ+7Gbk62GRUWK46XNmLh1ASp4xARecU//vEPxMTEYOnSpfjTn/40ovuM5yxYb51N6HS50djWhYyJkT4961BJZykOlnX25DiEGbQ4dq4R3wubAUEm2zMC4bWVIyVlBZSVV0lZAd/nZXEnIc/M3UQT20WP1ZxsM97dXYYjZ1ncEVHgePvttyEIAvbt24eioiI8/PDDeP7552E2mwe9z3jOgvXW2YT1zTa43CLMkSE+PZcxUM59nJkeg32F9Th1rgkpCeF+TjawQHlt5UZJWQFl5VVSVsA7eYc6B5bFnUREUUSlxYq4KAMMev4YxmqiOQxxUQacKG2Cw+mCVqOWOhIR0bj97W9/6///eXl5+MUvfjFkYScX9S29++3i2ClzRGZnmbGvsB4FxQ2yKe6ISNm4504irdYeWO0O7rcbJ0EQMCfbjO4eFwrPt0gdh4goqNU193bK5Bl3IzM9LQZqlYCjJdx3R0TeweJOItxv5z3smklEgeyVV15BRkaG1DFGxDNzFx/NYxBGwqDXYEpKNCrqrWhu75I6DhEFABZ3EunvlGlmcTde6RMjEBmmw9HiRrjcbqnjEBEFLc8B5nEs7kZsdmZf10zO3hGRF7C4k0iVxTNzx2Yq46USBORmmWC1O1BS1SZ1HCKioFXfbEN0uB4hOu4lH6n+4o5HIhCRF7C4k0ilxQq9Tg1TFD/d9AbP0szDXJpJRCSJHocLze3dXJI5SrGRIb1ntpa3wN7NM1uJaHxY3EnA4XSjtsmGJHMYVDI510bppqREw6DXoOBsA0RRlDoOEVHQsbTaIQKIZzOVUcvNNsPlFnHsHGfviGh8WNxJoKaxE25RxKQ4tj32Fo1ahVkZsWhq70ZFvVXqOEREQae+r1NmfDSLu9GaO7lv9ckZrj4hovFhcSeB/k6ZZu638yYuzSQikk5/p8wYLsscrYmmMMTHhOJEaRO6HS6p4xCRgo26uLPZbPjzn/+MV155BbW1tb7IFPAq+5upcObOm6anx0CrUeHwGYvUUYiI+gXLuOnplMkz7kZPEATMm2xGj8ONk6VNUschIgUbdXG3fft2REdHIzY2Fr/85S9x/PhxX+QKaJ7ibiJn7rwqRKfBjPRY1DbZ+mdHiYikFizjZn2zDYIAmNkobEy4NJOIvGHUvYpDQkJw0003AQCuueYabN++HTNnzvR6sEAliiIqLVaYo0Jg0LNVtLfNz4nDkbMNyC+y8AxBIpKFYBk361rsMEWGQKPmjo+xSIkPR2xECI6da4TD6YZWw9eRiEZv1O8carW6///r9XqEhXH2aTTaOntgtTtYePjIrAwTdBoVDp62sGsmEclCMIyb9m4n2jt72ExlHARBwNzJZti7XSgqb5Y6DhEp1KinjgoLC3HfffdhxowZmDVrFtraeGj0aHxzeDmLO1/Q69SYmWnCodMWVFqsSI7nvkYi8i+n0wmN5pvhNRjGzW+aqbC4G4+5k834d34lDp1pwMwMk9RxiEiBhp25e+ONN1BZWdn/9Y4dO/D0009jwYIFOHPmDDo6OnwaMNBUsrjzuflT4gAA+afZWIWI/O/666/HV1991f/1a6+9hmeeeSagx81vjkHgfrvxyJgYiUijDkeLG+Fyu6WOQ0QKNGxx9/LLLyMmJgYAYLVasW7dOlxxxRV47rnnsGHDBvzxj3/0echAUtnX6COJxZ3PzMiIhV6rxsGiei7NJCK/e/jhh/HUU0/hvvvuQ1lZGQDAYDBgwYIF+M53vhOQ4yY7ZXqHShAwJ9sMq92BMxWtUschIgUatrjT6XT9+wM++OADaLVafPjhh8jNzcXvf/97nwcMNJUWK/RaNbuJ+ZBeq8bsLBMaWrtQXh94n5ATkbytWLECH374IZYuXYq8vDw89dRTsFoDu4OvZ1lmHIu7cZuXza6ZRDR2wxZ3Wq22f/Zj165duOmmm5CRkYGtW7eioKDA5wEDicPpRl2TDUnmMKgEQeo4Ae2KvqWZB4u4NJOI/E+tVuOuu+7CRx99BJfLheuvvx5vvfWW1LF8xtJih1olwBQRInUUxctOjoLRoMWRsw1wc/UJEY3SsMXdokWL8OSTT+Lrr7/Gvn37sHTp0t47qlRwcz34qNQ2dcLlFrnfzg9mpMcgRKdGfhG7ZhKRdCIjI/HTn/4Uf/3rX/HJJ5/glltukTqST1hae49BUKn4weV4qVUq5GaZ0NbZg5KqwGu+Q0S+NWy3zK1bt2L79u346U9/ihtuuAHp6ekAALvdjq6uLp8HDCSeZircb+d7Wo0auVkm7CusR2ltOzImREodiYiChNPpRFlZGYqLiy/6X11dHZKTk6WO53X2bic6bA6kJLA7sbfMnRyHXcdrcfhMA7InRUkdh4gUZNjiTq/X4/HHH7/s+wcPHsTixYt9EipQsVOmf12RE499hfXIL7KwuCMiv5k9ezbi4uKQnZ2N7OxsrF69Glu3bkV6evpFRyQECktLb6fMOO4l95qpqdEw6DU4fNaCDddkcisHEY3YmEeZZcuWYdmyZd7MEvCqPJ0yeYC5X0xLjYFBr0H+aQtuX8HBkYj8Y//+/TAag+d9vqG1r7jjAeZeo1GrMCfLhD0n61Ba3Y7MJH5ASUQjM+yeO/IOURRRabHCFBkCgz7wPrmVI61GhTnZJrR0dKO0ul3qOEQUJIKpsAN699sBnLnztity4gEAB4vqJU5CRErC4s5P2jt70GFzcEmmn83vGxwPcHAkIvIJS98xCGYeYO5VU1OjERbSu/rE7WZjMCIaGRZ3flLJJZmSyEmJhtGgRX5RPVzs7kpE5HWePXfmSB6D4E0atQrzpsShrbMHZyt5oDkRjQyLOz+psnQCYDMVf9OoVZifE4d2mwOnzrdIHYeIKOA0tNoRHa6HTquWOkrAmd9/ZitXnxDRyLC485NKSwcAFndSWDgtAQCwv7BO4iRERIHF4XSjub2b++18ZHJyNCLCdDh0pgFOF1efENHwWNz5SaWlEzqtCmYOgH6XMSEC5qgQHDnbiO4el9RxiIgCRmObHSK4385XVCoBV0yOg9XuwOlyrj4houGxuPMDp8uN2qZOJJmNUKnYjt/fBEHAwqkJ6Ha4UFDcIHUcIqKAwTPufG/+1N6lmWwMRkQjweLOD+qabHC5RTZTkdDCab1dM/cVcnAkIvKW/mMQOHPnMxkTIxEToceRs41wOLk0k4iGxuLODyotvZ0yud9OOomxYUhNCEdhWTParN1SxyEiGpLL5cIjjzyCjRs34s4770RFRYXUkQbU0MLiztdUgoArpsTB3u3EybImqeMQkcyxuPODb45BCJM4SXBbNC0BblHE3hO1UkchIhrSF198AQB4/fXXsXXrVjz55JMSJxoYDzD3j/n9B5pbJE5CRHLH4s4PqjhzJwvzc+IgCMDuYzVSRyEiGtK1116L7du3AwBqampgMpkkTjQwS4sdYSEahIZopY4S0FITwmGOCsHRYjYGI6KhaaQOEAwqLVbERug5+Eks0qjHtNQYnCxrRn2zDfExoVJHIiIalEajwcMPP4xPP/0UzzzzzLC3Dw3Vjblpl1arhtGoH9V93G4RjW12pCREjPq+4zWWvFLxVtalsyfiH1+ew6mKFiydPdELyQYWjK+tPygpK6CsvErKCvg+L4s7H2vv7EFbZw9mZcRKHYXQ21jlZFkz9p+qx41L0qSOQ0Q0pN/85jf40Y9+hNtvvx0fffQRQkMH/1DKZusZ83WMRj2so9yP3NTWBadLRGzE6O87XmPJKxVvZZ2XbcY/vjyHLw5XITfTdzO5wfja+oOSsgLKyqukrIB38hoMukH/jcsyfayqb7/dpHguyZSDOdlm6LVq7D1ZC1EUpY5DRDSgd999Fy+++CIAwGAwQBAEqNVqiVNd7JtOmVwF4Q8JMaFIS4xA4flmtCroD1ki8i+/FnfHjh1DXl4eAKC8vBx33HEHNm3ahJ///OdwuwOzva9nvx2PQZCHEJ0GC6bFo6G1C2crW6WOQ0Q0oG9961s4deoU7rzzTtxzzz149NFHodfLa9lRA5up+N3i6QkQReDAKR7rQ0QD81tx99JLL2Hbtm3o7u79tOnJJ5/Egw8+iB07dkAURXz++ef+iuJXPAZBfq6ekwQA2M2umUQkU6GhofjDH/6Av/3tb3jjjTdw7bXXSh3pMvUtNgA8BsGf5ufEQa0SsO9kndRRiEim/FbcJScn49lnn+3/urCwEPPnzwcAXHXVVdi7d6+/ovhVZYMVWo0K8Vy2IhtTU2NgigzBodMNsHc7pY5DRKRInjPuzJy585vwUB1mpMeiwmLt3/ZBRHQhvzVUWbVqFaqqqvq/FkURgtDb1SssLAwdHR3DPsZ4OoEB/u+m43K5UdPYiZSECEREhIzqvuz84ztarRor5ibhzZ0lOHG+GSvmTpI60qCU9LoCysqrpKyAsvIqKSuNnaXVDp1GhSjj4Bv7yfsWT0/A0ZJG7DtZh/XLM6WOQ0QyI1m3TJXqm0nDzs5OREREDHuf8XQCA/zfTae6sRNOl4jE2NBRXzcYO//4i9Gox7zJZry1swSf51di/uQ4qSMNSkmvK6CsvErKCigrr7eyDtUNjKQliiIaWu0wRxv6P6gl/5iVGQuDXoP9p+px67KMcX3oTUSBR7JumVOnTsWBAwcAAF9//TXmzZsnVRSfqbT0zkZOYjMV2TFFGjAlJRrFVW2ob7ZJHYeISFE67A7Yu11spiIBrUaNK6bEoaWjG6crWqSOQ0QyI1lx9/DDD+PZZ5/Fhg0b4HA4sGrVKqmi+EyVpRMAm6nI1ZKZiQDYWIWIaLS4305ai6cnAAAbqxDRZfy6LDMpKQlvvvkmACAtLQ2vvvqqPy/vd57Nzkks7mRpTrYZBr0ae0/W4eal6VzaQkQ0Qt+cccfiTgqZSZG9jcHONGDTSicMesl22RCRzPAQcx+qtFgRHa6H0aCVOgoNQK9VY35OPFo6ulF4vlnqOEREiuGZueOyTGmoBAFLZiai2+FC/mmL1HGISEZY3PmI1e5AS0c3l2TK3JIZvUszdx2rkTgJEZFycOZOektmJEIQOH4R0cVY3PlIVd/h5UlspiJr6RMikGQOQ0FxI9oU0omQiEhqlhY7VIKAmFEe80PeExMRgulpsThX045qnnlHRH1Y3PlIZf9+uzCJk9BQBEHA1bkT4XKL2HWcjVWIiEbC0mpHbKQeGjX/jJDSVbP6Vp9w/CKiPnxX9pHKvpk7HoMgfwunJkCnVeGrozVwu0Wp4xARyVpXjxPtnT3cbycDszJNCA/VYu/JOjicbqnjEJEMsLjzkSqLFRq1gITYUKmj0DBCQzRYODUeTe1dOFnGxipERENpaO0CAJijOb5JTaNW4crpibDaHTha0ih1HCKSARZ3PuB2i6hu7MQEUxjUKr7ESrBs9kQAwJcF1RInISKSN0uLDQA7ZcrF0r6lmV+zsQoRgcWdT9S32OBwurkkU0HSEiOQkhCOY+ca0dzeJXUcIiLZYqdMeUmMDUNmUiROlTWjsc0udRwikhiLOx8or+8AAEyKD5c4CY3G8tyJEEV++klENBSecSc/S2cmQgSwm41ViIIeizsfqKzvbaaSEs+ZOyWZnxOHEJ0aXx+rgcvNjelERAPxzNyZWdzJxvwp8TDoe8cvp4vjF1EwY3HnAxWembs4ztwpSYhOg0XTE9Bq7cHR4iap4xARyZKlxY5Iow56nVrqKNRHr1Nj8fTEvvGLjVWIghmLOy8TRRHl9VaYIkMQGqKROg6N0vLc3sYqnx+ulDgJEZH8OF1uNLV3cUmmDK2Y0zt+7TxSJXESIpISizsva7X2wGp3IIX77RQpyWxETko0Tle09p9VSEREvZrauiCK3G8nR4mxYf3jV3Vjp9RxiEgiLO687JtmKtxvp1TXzksCAHx6iLN3REQX6t9vx06ZsuSZvfvyCI/1IQpWLO68zLPfLpkzd4o1K8MEc1QI9hfWo93WI3UcIiLZsLBTpqzNzjIhOlyPPSdrYe92Sh2HiCTA4s7LvumUyeJOqRjQswsAACAASURBVFQqAdfOnQSny42vjvJYBCIij/7iLjpU4iQ0ELVKhWWzJ6Crx4X9hXVSxyEiCbC487Ly+g4YDVpEGXVSR6FxWDIzESE6Nb44UsW20kREfRp4gLnsLZs1AWqVgJ0F1RBFUeo4RORnLO68yNblQGNbF1LijRAEQeo4NA4GvQZLZvS2lT50xiJ1HCIiWbC02mHQaxDGbtCyFWnUY+5kM6obOnG6vEXqOETkZyzuvMjTXXESl2QGhGvmJUEA8Gl+FT/9JKKg5xZFNLTaERdl4AeYMrfyikkAgH/lszEYUbBhcedF5X377ZLZKTMgxEeHYlamCWW17Thb2Sp1HCIiSbVZe+BwutkpUwEyJkQiMykSx881oYbHIhAFFRZ3XuTplMlmKoFjzcIUAMDH+yskTkJEwcThcOChhx7Cpk2bcNttt+Hzzz+XOhIsLTYAQDyLO0VYdUUyAODfnL0jCios7ryoot4KnVaFeHYRCxiZSZHISorEidImHmpORH7z/vvvIyoqCjt27MBLL72E7du3Sx2pv1OmmccgKEJulglxUQbsPVmH9k4e60MULFjceYnD6UZtUycmmY1QqbgXIZB4Zu/+eaBc4iREFCxWr16N73//+/1fq9VqCdP08hxgzjPulEGlErDyit5jfXYeqZI6DhH5CYs7L6lutMLlFtlMJQDNzIjFRHMYDp6yoLHvjxsiIl8KCwuD0WiE1WrF1q1b8eCDD0odiccgKNCSGYkIC9Fg55Fq9DhcUschIj9gL2MvqWAzlYAlCAKuW5CM//fDIvwrvxJ3rsyWOhIRBYHa2lo88MAD2LRpE9atWzfs7UNDdWNeOaLVqmE06oe8TWNbF7QaFZISIiRfoTKSvHIhZVYjgJXzk/Hu16U4UtKIa/v24Q2Fr61vKCkroKy8SsoK+D4vizsv8TRTSY7jzF0gmp8Tj3e+LsWuYzW44cpUhIfykHoi8p3GxkZs2bIFjz32GBYtWjSi+9hsY99XZTTqYbV2D3mbuiYbTJEh47qOt4wkr1xInXXpjER8uKcM735Viismm6FWDb1oS+q8o8GsvqOkvErKCngnr8Ew+N+hXJbpJeV1HVCrBEyKC5M6CvmARq3Ct+Yno8fpZucxIvK5F154Ae3t7XjuueeQl5eHvLw8dHV1SZbHanfA1u3kfjsFig7XY8nMCbC02nGwyCJ1HCLyMc7ceYHT5UaFxYqJ5jBoNdJveiffWDZrAj7eV47PDlfhW1dM4uwdEfnMtm3bsG3bNqlj9PPst+MZd8q0ZkEyvj5agw/3nseCqfFQ8RB6ooDFmTsvqGnshMPpRmpChNRRyId0WjXWLExBd4+Ls3dEFFQ8xyBw5k6ZTFEGLJoej9omG46caZA6DhH5EIs7Lzhf17vfLjWR++0C3bLZExBp1OGzw1XokMG+EyIif/AcYB7Hc1wV6/pFqRAAfLj3PERRlDoOEfkIizsvOF/bDgBI48xdwLtw9u5fBzl7R0TBwcJjEBQvISYUV+TEocJixfFzTVLHISIfYXHnBWV1HdCoBUw0s5lKMFg2q3f27vPDVWjn7B0RBYGGFjsEATBFhkgdhcZh7aJUAMAHnL0jClgs7sbJ4XSjymLFpDgjNGq+nMFAp1Xj+oUp6Ha48K8DFVLHISLyufpWO2IjQjjOKVxSnBFzss0orWnHiVLO3hEFIr5Lj1NVgxUut8hmKkFm2ewJiA7X4/PDVWjpUM7ZKkREo9XtcKHN2gMzm6kEhJuWpEEA8PZXpXBz9o4o4LC4G6f+ZioJbKYSTLQaNW5ckoYepxvv7iqVOg4Rkc80cL9dQEmKM2LBtHhUWqw4dJrn3hEFGhZ349TfTCWRM3fB5soZCZhgCsPuE7WobuyUOg4RkU/0H4PA4i5g3LQkDWqVgHe+LoXT5ZY6DhF5EYu7cTpf1wGdRoVEE9tDBxu1SoXblmVAFIG3vzwndRwiIp/gGXeBJy46FEtnTUB9ix17T9ZJHYeIvIjF3Tj0OFyobuhEcnw41Cq+lMFoVmYsspMicbSkEWcrW6WOQ0T0/7d35+FR1XfbwO8zayaZ7PtCFgKBQNjCItAC8lLE0ghYpRIVrCCib31Qq7i1Kpa8qG1t30e6ieKGgqbUpXVB0QdFERECScgGZAMSQvZtJpOZycx5/phkkpAQss6Zmdyf68qVmXNmuTke55vvmd/5nWHXOSyTBzHdyQ3zY6FUyPDhtyUwmS1SxyGiYcKOZAguVOlgFUWebzeKCYKA1YvHAQDe/Z9CnpxORG6n4wLmwX68DII78fdWY8nMKNQ3G3HgOK/bSuQu2NwNQXH7+Xax4WzuRrP4SF/MmhiCkoomHOHwFiJyM1UNBvh4qeChUkgdhYZZyrwYaDVKfHTkHBp1nPmZyB2wuRuC4ou25i4+wlfiJCS1XyyOh0ohw76vimAwtkkdh4hoWLRZrKhtNHIyFTfl6aHEjQviYDRZ8D5nfiZyC5I3d6tWrcLatWuxdu1aPP7441LHGZCi8kZoNUoWPUKQrwbL58agUW/Cf74rlToOEdGwqG1qhVUUOZmKG1s4PQKRQV74JqsC5yubpY5DREMkaXNnNNqGAOzevRu7d+/Gs88+K2WcAWnUGVHT2IqxET4QBEHqOOQErr8mGoE+Hjhw7AIqanlpBCJyfdWcKdPtyWUy3LJkHEQA73x5FiLPHSdyaZI2dwUFBTAYDFi/fj3WrVuHzMxMKeMMSJF9SCavb0c2KqUca5aMg8UqYi8LJBG5gSpewHxUSIoLxNT4QBScb8DRvEqp4xDREEh6drSHhwc2bNiA1atXo7S0FBs3bsT+/fuhUPQey9NTBZls8N+SKZVyaLXqQT+/qwvVtm9mksYFDdtrdjWcWR3BlfKOZNaFyVE4lF2BU0W1yDlXj3lJ4UN6PVfaroBr5XWlrIBr5XWlrNS3jmvcBbO5c3trloxHXmkdXv84D9s2XAONmhPoELkiSf/PjYuLQ0xMDARBQFxcHPz8/FBdXY3w8N7/IG5pMQ3p/bRaNXTDNBtUfmkdBABhfpphe82uhjOrI7hS3pHOeuuS8XiytB67/pOHsWHe8PJQDvq1XGm7Aq6V15WyAq6Vd7iyajSqYUhDQ8ELmI8eYQGeWD43Bv8+XIoPvy3BmiXjpY5ERIMg6bDMffv24bnnngMAVFZWQqfTITg4WMpI/WKxWlFa0YTIYC8e2aIeQgM8sfLHsWjSm/DPg0VSxyEiGrTqBgM0agW0msEfpCLX8bN5MQgN8MSB4xdw7hInVyFyRZI2dzfffDOam5uRmpqKBx98ENu3b7/ikExnUlalh6nNirG8BAJdwbI50YgK9sKhrIs4fb5e6jhERANmFUVUNRgQ4qfhxGGjhFIhx103TIIoAm9+dhpWK88dJ3I1kjZ3KpUKL7zwAvbu3Ys9e/YgOTlZyjj9VnSxEQAQH8nJVKh3CrkMd/x0IgQAr+8/DZPZInUkIqIBadSZYG6z8ny7UWba+GDMSQxBSUUTDp4slzoOEQ2Q5Ne5c0VF5e3NHb+5oz7ER/hiycwoVNa14L1DvDgsEbmWqvoWAEAom7tRJ3XJeHh5KPDPrwrt+wERuQY2d4NQWN4IT7UCYYGeUkchJ3fTtfEIDfDE58cuIP8ch2cSkeuwz5TJyVRGHV+tGrddlwCT2YpXP86HlZf2IXIZbO4GqL7ZiOqGVoyP8oWM5yDQVaiVcmxMmQSZIGDXx3loaW2TOhIRUb/Yr3HH5m5UuiYxFDMTgnGmrBFfHi+TOg4R9RObuwE6c6EBAJAQ7SdxEnIVYyN8kDI/BnVNRuz54ozUcYiI+qWaFzAf1QRBwNplE6DVKPGvr4twqY7DM4lcAZu7AbI3d2PY3FH/pcyPRWyYN77LuYSjeZVSxyEiuqrKegMUchn8vHlB+tHKx0uFtcsmwNRmxUv/zkWbxSp1JCK6CjZ3A3TmQgNUShliQr2ljkIuRCGXYeMNk6BWyfH6/gIeASUip1ddb0CwnwdPQRjlZk8MwY+mhOHcpWbs+4rXbiVydmzuBqC5xYTyGj3iI3yhkHPT0cCEB3rhjusnwGiy4G/v5/DyCER0VVlZWVi7dq3D31dnMKPF2IZQf04cRsBtSxMQ1j45WFZhjdRxiKgP7FAG4GyZ7RIIEzgkkwZp7qQwXDs9AmXVOuz54qzUcYjIib388sv47W9/C6PR6PD35kyZ1JWHSoF7Vk6GQi7Dro/zUd/s+H2SiPqHzd0A8Hw7Gg6pPxmP6BAtDmVdxLfZFVLHISInFR0djR07dkjy3lUNtqHjnEyFOkSHemPNknHQGcz4+4c5PP+OyEmxuRuA0xcaIJcJGBvhI3UUcmFKhRz33pgELw8F3vysAIXt3wgTEXW1bNkyKBQKSd67up4zZVJPi2dEYk5iCArLGjn6hMhJSVM1XJC+1Yzzl5oxLsoXKqVc6jjk4kL9PXHPqiT8+d0s/OW9bDx5x2wE+npIHYuIXJinpwoy2eAmP1Eq5dBqO2fFrNOZAACxEb7dljuLy/M6M1fKClw9732rp+HJnd/jq5PlSIj2w09mRzswXXeutG1dKSvgWnldKSsw8nnZ3PVTfmk9RACTYwOkjkJuYnJsAFJ/Mh5vHziDHf/KxuO3z4RaxQMHRDQ4LS2mQT9Xq1VDp+s8j+pitQ6CAGiUsm7LncXleZ2ZK2UF+pf3V6uS8Ls3jmPXf/IQ6K3G+ChpTldxpW3rSlkB18rrSlmB4cmr0aiuuI7DMvsp71w9AGASmzsaRv8nORKLpkfgfJWO5zAQkdOorDcgyNeDM0NTr4L8NLh3VRJEEdjxr1Oo5OV9iJwGP7X7Ka+kDh4qOeIieH07Gj6CIOC2pQmYHBeA7KJavLG/AKIoSh2LiJxEVFQU0tPTHfqeBmMbmvQmXgaB+pQY44+1yxKgM5jxp/RMNOoH/80xEQ0fNnf9UN1gQFWDAROj/SGXcZPR8FLIZfjVjUmIC/fG4VOX8K+vi6WORESjWMdlEEID2NxR3xZNj8QN82NR3dCK//5nFlpNbVJHIhr12Kn0Q377kMzJcRySSSPDQ6XA/aunIdRfg0++P4f9R89LHYmIRqlL7UPsQjlTJvXDqgVx+PGUcJReasbf3s+BuY2nFxBJic1dP+SW1AEAJsX6S5yE3JmPpwoP3TId/t5qpB8sxOc/sMEjIserrG9v7vjNHfWDIAhYd/0ETI0PRE5JHf7+Ac8fJ5ISm7ursFpF5J+rh7+3GmEsdDTCgvw0eCR1Bvy0KrzzP4X46HCJ1JGIaJSprOOwTBoYhVyG/7sqCZNi/ZFZWIN/fJjLBo9IImzurqL4YhN0BjOmjA2EIAzu+kFEAxEa4IlHb02Gn1aFNz8t4BBNInKoyvoWyGUCAn1c57pRJD2VUo7/umkqJkb74cSZauz8Nxs8IimwubuKzMIaAMD0cUESJ6HRpKPBC/CxDdFMP1jIWTSJyCEq61oQ7KfhBGI0YGqlHPffPA0JY/xw/HQ1XtyXDaPJInUsolGFn9xXkVVYA6VChkSeb0cOFhrgiW0b5yEswBP7j57Hqx/n8ygoEY0oncEMfWsbJ1OhQVOr5HjwF9Ps5+D98d2T0BnMUsciGjXY3PWhusGA8ho9EmP8oVbKpY5Do1CwvwaP356MuHAfHM65hBf/lY2WVhZJIhoZHRej5vl2NBRqpRz3/XwK5k0ORVF5E55/+wRqGgxSxyIaFdjc9SGLQzLJCXh7qvBI6gzbUdDiOqS9mWGfqpyIaDhxpkwaLgq5DBtSJmHprDEor9Fj25vHceZCg9SxiNwem7s+nDxra+6mxgdKnIRGO7VKjs03TcX110TjUl0Ltr1xHNlFtVLHIiI3Y58pk8MyaRjIBAGpPxmPtdclQG9owx/2nsQ32ReljkXk1tjcXUGj3oSC8/WIj/RBgI+H1HGIIJMJ+MXicbgrJRHmNiv++59Z2PdVEc/DI6Jh0/HNHS/9Q8NpcXIUHrplGjxUcrz2SQFe/7QAJjMnWiEaCWzuriDjdBVEEZg9MVTqKETdzE8Kx+O3JyPIzwOffH8Oz+/huQxENDwq6wxQKmTw8+ZlEGh4JcYG4Ld3zEJ0iBaHsi5i25vHUVGrlzoWkdthc3cFP+RXQQAwe2KI1FGIeogL98HWO+fgmkm2k9Wffu0Yvsup4OUSiGjQRFFEZX0LQvw1kPG6rjQCQv098Zt1M7E4ORLl1Xo88/oxHDxRBitrF9GwYXPXi/pmI85eaMD4KF/48+glOSmNWoG7b5iEO5dPhNUq4pWP8vH//5mN2sZWqaMRkQtq0pvQarIgzJ9DMmnkKBVyrL1uAu5dlQSFTIbdn5/BH/eeRDVHoBANCzZ3vfghvxIigNmJHJJJzk0QBCyYGoFtd83B5LgAnCquxW93HcUXxy/AYuW5eETUf5X1tj+uQwI4mQqNvNkTQ7DtrmswfVwQCs434KldP+DAMdYuoqFic3cZURRxKOsiFHIBcxI5JJNcQ5CvBr/+xTSsX54IuSBgzxdnsfXVY8gtqZM6GhG5CPs17vjNHTmIv7ca/3XTFGy8YRIUcgF7vzyLra8dQ34paxfRYCmkDuBsCssbUVHbgjmJIfD2VEkdh6jfBEHAj6eGY0p8IN4/VIRvsirwwruZmD4uCD9fNBZRwVqpIxKRE7vEmTJJAoIgYN7kMEyOC8B7Xxfjm6yL+MM7mZg5IRg3LYrn/kg0QGzuLnMo03b9lUXTIiROQjQ4vl4q/PKniVg8Iwp7vzyLzMIaZBXWYNbEEKz4cRwig7ykjkhETqiK17gjCfl4qvDLn07EtTMi8PaBM8g4XY2TZ2owPykMK34UiyA/7pdE/cHmrouWVjOOFVQh2M8DE2L8pY5DNCQxYd549NYZyC6qxQffluBYQRWOF1RhdmIIls2JRly4j9QRiciJVNa3QK2Sw8eLo1ZIOrFhPnji9pk4caYaH3xTgm9PVeBI7iXMTwrDdXOieYCS6CrY3HXxVeZFmNqsuHZ6JKeBJrcgCAKmjQvC1PhAZBXW4oNvi/FDfhV+yK/CuEhfLJ09BskJQZDLePot0Win1SgR5KuBwPpHEhMEATMnhGDG+GD8kF+JD78twTfZFfgmuwJTxgZi2ZwxSORBeKJesblrZ26z4sCxC/BQybFoeqTUcYiGlSAImD4+CNPGBSLvXD0OHLuA7KJaFJY3wt9bjflJYZifFIbwQB4RJRqtHloznQc2yanIZALmTg7DnMRQnDxbg8+Pncep4lqcKq5FeKAnlswag5kJwfDlt81Edmzu2n2XU4FGvQnXXxMNTw9uFnJPgiBgcmwAJscGoKJWjy8yyvB97iV8fOQcPj5yDvGRPvhRUjiSE4I5NItolOE3+OSsZDIBMycEY+aEYBRfbMIXxy/g+OlqvPXZaew9cAZT4wNxzaRQTIsPglollzoukaTYxQAwmS349+FSKBUyLJ01Ruo4RA4RHuiFtddNwC2Lx+HE2WocPnUJeSV1KCpvwu7PT2N8lB+SE4KRnBCEIF+eyE5ERNIbG+GDu1dMxq0GMzKLanHgh/M4ebYGJ8/WQKWQYUp8IGZNCMGUsQHw9FBKHZfI4djcAThw/ALqm41YPjcG/t5qqeMQOZRKKcfcSWGYOykMdU2tOF5QhYwz1Th7oQFnLjTgnS/PIizAE5NjAzApzh8To/2hUfOjg4iIpKPVKHH93Bj8aHIoyqr1OF5QheOnq5BxuhoZp6shEwSMjfRBUlwAkuICERvmDZmMw47J/Y36v9BqG1vx8ZFz8PJQYPncaKnjEEkqwMcD182JxnVzotGoM+Lk2RpkFtbg9PkGfHmiDF+eKINMEBAT5o34CB/ER/oiPtIHgT4enISBiIgcThAEjAnRYkyIFqsWxOFijR4ZZ6qRU1yHovJGFJY14oNvSqBRKxAf6YNxkb4YH+mLuAgfeKhG/Z/B5IZG9V4tiiJe/zQfrSYL7lw+kV/fE3Xhq1Xj2hmRuHZGJNosVhSVNyK3tB75pXUovdSMkoomfJFR1v5YFWJCvTE20hehfhpEBXshNMATCjnP4SEiIscQBAGRwVpEBmux4kdx0LeakV9aj5ySWpw+34Cc4jrkFNcBAGSCgIggT4wJ8bY1h6G2BtHHk+ebk2sb1c3d/h/OI7e0HlPGBuLHU8KljkPktBRyGSZE+2NCtD+wcCxMZgvOVTajqLwJRRcbUXyxCdlFtcguqu3yHAFhAV4IDdAgxE+DEH8NQvw9EeKngb+PmrPyERHRiPLyUGLWxBDMmhgCAGjSm1BU3oiz7d/ona9qRlm1HkdyO5/j66VCqL8GIQGeCAvwRKi/BqH+ngj203CyFnIJkjZ3VqsVW7duxenTp6FSqZCWloaYmBiHvPf3eZew72AR/L3VuHP5RA4pIxoAlVKO8VF+GB/lZ1/W3GJCrc6Es+frUValQ1m1DhdrWlBWrevxfLlMgJ9WBT9vNfy1atvv9tu+WjW0GmX7jwJKBYspjU5S1kgid+TjpcKMhGDMSAgGAFitIqoaDLhQpcP5ymZcqNLhYo0eZ8sacaasscfzvTwUtlrl7QF/bzUCfGx1y8dLBa2nEt4aJbQaFTRqOf+uJMlI2tx98cUXMJlMePfdd5GZmYnnnnsOf//730f0PdssVnx69Dw+OFQMD7UC/3XTFPhpOYkK0VB5e6oQHuKN2BCtfZkoimjSm1BZb0BVvQFVDQZU1begtrEV9TojSiuaUWRt6vN11Uo5tBoFvDS2wqnxUMJDJW//UUDTflvdfr/jtkohh1Ihg1Iug6L9t1Ihg0IusOiSS5CiRhKNJjKZgLD2b+hmt3+7B9iufVzdYEBlfQsq62y/axpbUd9sRG1TK8qq9X2+rlwmdGn2lPBQKeDtpYJCLkDTXqc06s7ftpplq1FKReftjt8KuYx1i/pN0uYuIyMDCxYsAABMnz4dOTk5I/p+5dU6/L/Xj6GmsRX+3mpsvmkqYsK8R/Q9iUYzQRDg2/5tXMIYvx7rrVYRzS0m1DUb0dBsRL3OiCa9CTqDGTqDGXqDGc3tvyvrDDhv7vkt4GAouxTMjuZPLhMgEwTIZLbCLJMJkAvtv2UCZDKZfblMQJfltucJgu3fK9j+4bb76FwmtC8DbOd6QED7YzqeCwC21+7+GNvz1WoFTKa2Htu32/3e/rHC5Xev/gfC5X9D9HjGVd43MlSLSdH+V30f6pujayQR2SgVMkQEeSEiyKvX9QZjG+qbjahrbkV9kxE6gxnNLWY0G0zQtZjt92ubjFdtBAeSSaXorFcddUkh66xT8i51SS4TIJfLIBMEyOWdy7vWnK71SdZ+HwIggwCVWg6z2dJZ39ClzvWoXx21rzNvX3Xj8nV99a1CH8/rWKBWKWA0tfVZ34RBZhtuggDMnxoBzxEc4itpc6fT6aDVdh7ll8vlaGtrg0LReyxPT9WQprG9UNuCVpMF110TjTVLxkPrxCfNKpVyaF3oG0VXysusI2cweX18PBAZ1r/HmswWtLS2wWBsg8HUhlajBa2m9vtdbreaLDC3Wdt/LDB13DZbYLbYbrdZrDCabctaTW2wWkVYrSIs7T9WUYTFIg5iKxAAvPabn8BLw0mqhsKRNXI0fNZIxZWyAq6VV6qsWq0awYG9N36Xs1istppkEdGkN7bXq/af1ja0GNvQamyz1ylTmwVmsxWmbrctMJk7a5rFaqtP5jYLWqxW+31L+22RpcupVTcZsXHF5BF7fUmbO61WC72+84iG1Wq9YtECgJYW05DeLzHGHy/ev6D9zUTodMYhvd5I0mrVTp3vcq6Ul1lHjiPyKgTA20MBb4+hfXz1N6tV7Gz6Lv8tip33RdiGoYoi7LfR5bbtbmfRtXas77JcbF9ptT0JVqD9MSI8PJQwtJrtuXoW757V/PLH9OMpEC9feJXX6O2PiIgQLUSLdcj7gkbjvAfgHMGRNZKfNSPHlbICrpXXlbL6adVQQAS8Rv5zrePgpK1WWTsPWlo7a01vNcsqdtYuD40Ser3J/nqX16oev7u8f1+1pq8a03d9Ea+4TqNRosVgvtJDu79nHzXNUU1xcmLIiNZHSZu75ORkHDx4EMuXL0dmZiYSEhKkjENE1INMECCTC5B6XhdX+iPGlbI6M9ZIIhoMmSBApuj4Fn9wxcuVPsddKSsAaD1VI5pX0uZu6dKlOHz4MNasWQNRFLF9+3Yp4xARETkN1kgiIhooSZs7mUyG3/3ud1JGICIickqskURENFAyqQMQERERERHR0LG5IyIiIiIicgNs7oiIiIiIiNwAmzsiIiIiIiI3wOaOiIiIiIjIDbC5IyIiIiIicgNs7oiIiIiIiNwAmzsiIiIiIiI3IIiiKEodgoiIiIiIiIaG39wRERERERG5ATZ3REREREREboDNHRERERERkRtgc0dEREREROQG2NwRERERERG5ATZ3REREREREbkAhdYDhZrVasXXrVpw+fRoqlQppaWmIiYmxr09PT8c777wDhUKBe++9F4sXL5Ysq9lsxhNPPIHy8nKYTCbce++9WLJkiX39a6+9hn379iEgIAAA8Mwzz2Ds2LFSxQUArFq1Ct7e3gCAqKgoPPvss/Z1zrRtAeC9997D+++/DwAwGo3Iz8/H4cOH4ePjAwBIS0vDiRMn4OXlBQD429/+Zv+3OVJWVhb++Mc/Yvfu3Th37hwee+wxCIKA8ePH4+mnn4ZM1nkMprW1FVu2bEFtbS28vLzw/PPP2/cPR2fNz8/Htm3bIJfLoVKp8PzzzyMoKKjb4/vaXxydNzc3F/fccw9iY2MBAKmpqVi+fLn9sc60bR988EHU1NQAAMrLyzFt2jT8+c9/tj9WFEUsXLjQ/m+ZPn06HnroIYfk7O1za9y4cU6931In1siR5So1kvVx5PM6e410pfp4eV5nrZFOUx9FN/PZZ5+Jjz76qCiKonjy5Enxnnvusa+rqqoSU1JSRKPRKDY1NdlvS2XfBRUoEAAACFpJREFUvn1iWlqaKIqiWFdXJy5atKjb+oceekg8deqUBMl619raKq5cubLXdc62bS+3detW8Z133um2bM2aNWJtba1EiWx27twppqSkiKtXrxZFURQ3bdokfv/996IoiuKTTz4pfv75590e/+qrr4ovvviiKIqi+NFHH4nbtm2TLOttt90m5uXliaIoinv37hW3b9/e7fF97S+OcHne9PR0cdeuXVd8vDNt2w4NDQ3iihUrxMrKym7LS0tLxU2bNjksX1e9fW45835L3bFGjhxXrZGsjyOT15lrpCvVR1F0nRrpLPXR7YZlZmRkYMGCBQBsnXpOTo59XXZ2NmbMmAGVSgVvb29ER0ejoKBAqqi4/vrrcf/999vvy+Xybutzc3Oxc+dOpKam4qWXXnJ0vB4KCgpgMBiwfv16rFu3DpmZmfZ1zrZtuzp16hQKCwtxyy232JdZrVacO3cOTz31FNasWYN9+/ZJki06Oho7duyw38/NzcWcOXMAAAsXLsR3333X7fFd9++FCxfiyJEjkmX905/+hMTERACAxWKBWq3u9vi+9hcp8ubk5OCrr77CbbfdhieeeAI6na7b451p23bYsWMHbr/9doSEhHRbnpubi8rKSqxduxYbN25EcXGxo6L2+rnlzPstdccaOXJcsUayPg4fV6qRrlQfe8vbwdlqpLPUR7dr7nQ6HbRarf2+XC5HW1ubfV3XYQVeXl49dmBH8vLyglarhU6nw+bNm/HAAw90W/+zn/0MW7duxRtvvIGMjAwcPHhQoqQ2Hh4e2LBhA3bt2oVnnnkGDz/8sNNu265eeukl/OpXv+q2rKWlBbfffjv+8Ic/4JVXXsGePXskKbTLli2DQtE5OloURQiCAMC2DZubm7s9vut27m29I7N2fJieOHECb731Fn75y192e3xf+4sUeadOnYpHHnkEb7/9NsaMGYO//vWv3R7vTNsWAGpra3HkyBH8/Oc/7/H44OBg3H333di9ezc2bdqELVu2OCpqr59bzrzfUneskSPHFWsk6+PwcaUa6Ur1sbe8gHPWSGepj27X3Gm1Wuj1evt9q9Vq3yEuX6fX6yUZQ95VRUUF1q1bh5UrV+KGG26wLxdFEXfccQcCAgKgUqmwaNEi5OXlSZgUiIuLw4oVKyAIAuLi4uDn54fq6moAzrltAaCpqQnFxcWYO3dut+UajQbr1q2DRqOBVqvF3LlzneIoatdx2Hq93n7+Q4eu27m39Y72ySef4Omnn8bOnTt7jBHva3+RwtKlS5GUlGS/ffn/T862bffv34+UlJQe31YAQFJSkv3co1mzZqGyshKiKDos2+WfW662345mrJEjx9VqJOvjyHOVGulq9RFw3hrpDPXR7Zq75ORkHDp0CACQmZmJhIQE+7qpU6ciIyMDRqMRzc3NKCoq6rbe0WpqarB+/Xps2bIFN998c7d1Op0OKSkp0Ov1EEURR48etf+PJ5V9+/bhueeeAwBUVlZCp9MhODgYgPNt2w7Hjh3D/PnzeywvLS3FrbfeCovFArPZjBMnTmDy5MkSJOxu0qRJOHr0KADg0KFDmDVrVrf1ycnJ+Prrr+3rZ86c6fCMHT788EO89dZb2L17N8aMGdNjfV/7ixQ2bNiA7OxsAMCRI0d6/Pd2pm0L2DIuXLiw13V/+ctf8MYbbwCwDe2JiIiwHxkcab19brnSfjvasUaOHFerkayPI8uVaqSr1UfAOWuks9RHQXTk4V4H6JgJ7MyZMxBFEdu3b8ehQ4cQHR2NJUuWID09He+++y5EUcSmTZuwbNkyybKmpaXh008/7Ta71+rVq2EwGHDLLbfggw8+wO7du6FSqTBv3jxs3rxZsqwAYDKZ8Pjjj+PixYsQBAEPP/wwsrKynHLbdnjllVegUCjswyFee+01e96XX34Z+/fvh1KpxMqVK5GamipJxrKyMvz6179Geno6SkpK8OSTT8JsNmPs2LFIS0uDXC7H+vXr8Y9//AMWiwWPPvooqquroVQq8cILLzi0GHRk3bt3L+bNm4fw8HD7UabZs2dj8+bNeOSRR/DAAw8gKCiox/6SnJzssKxd86anpyM3Nxfbtm2DUqlEUFAQtm3bBq1W63TbNj09HYBtyNnevXu7HcXryGowGLBlyxa0tLRALpfjqaeeQnx8vENy9va59Zvf/AZpaWlOu99SJ9bIkeNqNZL1ceTyukKNdKX6eHlewDlrpLPUR7dr7oiIiIiIiEYjtxuWSURERERENBqxuSMiIiIiInIDbO6IiIiIiIjcAJs7IiIiIiIiN8DmjoiIiIiIyA2wuSMiIiIiInIDbO6IiIiIiIjcgELqAETU07Fjx3D33XcjOjoaACAIAlJSUnDnnXdCLpdLnI6IiEg6rJFEV8bmjsgJ5ebmYunSpfj9738PAKirq8N9992H1tZW3HfffRKnIyIikg5rJNGVcVgmkRPKy8tDYmKi/X5AQADuuusufPbZZxKmIiIikh5rJNGVsbkjckKXFy4A0Gg0qK+vlygRERGRc2CNJLoyNndETqa1tRUlJSU9CldpaSni4+MlSkVERCQ91kiivrG5I3IyBQUFCAkJga+vr32ZxWLBnj17sHLlSgmTERERSYs1kqhvbO6InExubi4mTpxov19XV4fHHnsMERERWLVqlYTJiIiIpMUaSdQ3zpZJ5GTy8/Nx8uRJ3HjjjRAEAWq1GsuXL0dqaipkMh6PISKi0Ys1kqhvgiiKotQhiIiIiIiIaGh4iIOIiIiIiMgNsLkjIiIiIiJyA2zuiIiIiIiI3ACbOyIiIiIiIjfA5o6IiIiIiMgNsLkjIiIiIiJyA2zuiIiIiIiI3ACbOyIiIiIiIjfwv/tA+/2QDrByAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 1080x360 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure(figsize=(15, 5))\n",
    "\n",
    "ax = fig.add_subplot(1, 2, 1)\n",
    "ax.plot(D, Sd)\n",
    "ax.set_title(\"Surface Area for unit sphere in $D$ dimensions\")\n",
    "ax.set_xlabel(\"$D$\")\n",
    "ax.set_ylabel(\"$S_D$\")\n",
    "ax.grid(alpha=0.6)\n",
    "\n",
    "ax = fig.add_subplot(1, 2, 2)\n",
    "ax.plot(D, Vd)\n",
    "ax.set_title(\"Volume of a unit sphere in $D$ dimensions\")\n",
    "ax.set_xlabel(\"$D$\")\n",
    "ax.set_ylabel(\"$V_D$\")\n",
    "ax.grid(alpha=0.6)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Exercise 1.20\n",
    "By considering\n",
    "$$\n",
    "    p(\\mathbf{x}) = \\frac{1}{\\left(2\\pi\\sigma^2\\right)^{D/2}}\\exp{\\left(-\\frac{||\\mathbf{x}||^2}{2\\sigma^2}\\right)}\n",
    "$$\n",
    "\n",
    "Show that the integralof the probability density over a thin shell of radius $r$ and thickness $\\varepsilon$, where $\\varepsilon \\ll 1$, is given by $p(r)\\varepsilon$ where\n",
    "\n",
    "$$\n",
    "    p(r) = \\frac{S_Dr^{D-1}}{\\left(2\\pi\\sigma^2\\right)^{D/2}}\\exp\\left(-\\frac{-r^2}{2\\sigma^2}\\right)\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import sympy\n",
    "from sympy import cos, sin\n",
    "t1, t2, t3, r = sympy.symbols(\"theta1 theta2 theta3 r\")\n",
    "x1 = r * cos(t1)\n",
    "x2 = r * sin(t1) * cos(t2)\n",
    "x3 = r * sin(t1) * sin(t2) * cos(t3)\n",
    "x4 = r * sin(t1) * sin(t2) * sin(t3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "r**2*sin(theta1)**2*sin(theta2)**2*sin(theta3)**2 + r**2*sin(theta1)**2*sin(theta2)**2*cos(theta3)**2 + r**2*sin(theta1)**2*cos(theta2)**2 + r**2*cos(theta1)**2"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X2 = sum([x**2 for x in [x1, x2, x3, x4]])\n",
    "X2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "r**2"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X2.simplify()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Exercise 1.27\n",
    "Consider the expected loss for regression problems underr the $L_q$ loss function\n",
    "$$\n",
    "    \\mathbb{E}[L_q] = \\int\\int |y(x) - t|^q p(x, t) \\ dx dt\n",
    "$$\n",
    "\n",
    "----\n",
    "Since we can choose $y(x)$ independently of $x$, the minimum of $\\mathbb{E}[L_q]$ can be found by minimizing the function in a pointwise manner\n",
    "\n",
    "$$\n",
    "\\begin{align}\n",
    "\\arg\\min\\mathbb{E}[L_q] &= \\arg\\min \\int |y(x) - t|^q p(x, t) dt \\\\\n",
    "                        &= \\arg\\min \\int |y(x) - t|^q p(t|x)p(x) dt \\\\\n",
    "                        &= \\arg\\min \\int |y(x) - t|^q p(t|x) dt \\\\\n",
    "\\end{align}\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x540 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "t = np.linspace(-0.5, 0.5, 10000)\n",
    "plt.figure(figsize=(10, 7.5))\n",
    "plt.title(r\"$|t|^q \\phi(t)$\", size=20)\n",
    "for q in [1, 2, 4, 16]:\n",
    "    plt.plot(t, np.abs(t) ** (1 / q) * norm.pdf(t) , label=f\"1/{q}\")\n",
    "plt.legend()\n",
    "plt.grid(alpha=0.3)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Exercise 1.30\n",
    "\n",
    "Evaluate the Kullback-Leibler divergence between two gaussians.\n",
    "\n",
    "$$\n",
    "    KL(p||q) = -\\int p(x) \\log{\\frac{q(x)}{p(x)}} dx\n",
    "$$\n",
    "\n",
    "where \n",
    "* $p(x) = \\frac{1}{\\sqrt{2\\pi\\sigma^2}}e^{-\\frac{1}{2\\sigma^2}(x - \\mu)^2}$\n",
    "* $q(x) = \\frac{1}{\\sqrt{2\\pi s^2}}e^{-\\frac{1}{2 s^2}(x - m)^2}$\n",
    "\n",
    "We can divide up $-p(x) \\log{\\frac{q(x)}{p(x)}}$ into $\\frac{1}{2}(A + B + C)$; where\n",
    "\n",
    "$$\n",
    "    A = -\\log\\left(\\frac{\\sigma^2}{s^2}\\right)\\mathcal{N}(x | \\mu, \\sigma^2)\n",
    "$$\n",
    "\n",
    "$$\n",
    "    B = -\\mathcal{N}(x | \\mu, \\sigma^2)\\left(\\frac{1}{\\sigma^2}(x - \\mu)^2\\right)\n",
    "$$\n",
    "\n",
    "$$\n",
    "    C = \\mathcal{N}(x | \\mu, \\sigma^2)\\left(\\frac{1}{s^2}(x - m)^2\\right)\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from ipywidgets import interact, FloatSlider, Dropdown\n",
    "from scipy.integrate import quad\n",
    "from scipy.stats import norm\n",
    "\n",
    "mu, sigma2 = 1, 1\n",
    "m, s2 = 2, 2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "After integrating all terms, we conclude:\n",
    "$$\n",
    "    KL\\left(\\mathcal{N}(\\mu, \\sigma^2)||\\mathcal{N}(m, s^2)\\right) = \\frac{1}{2}\\left(\\frac{1}{s^2}\\left(\\sigma^2 + (\\mu - m)^2\\right) - \\log\\left(\\frac{\\sigma^2}{s^2}\\right) - 1\\right)\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.34657359027997275, 1.1377960462583034e-09)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Integral approximation\n",
    "def kl(x, mu, sigma2, m, s2): return -norm.pdf(x, loc=mu, scale=np.sqrt(sigma2)) * \\\n",
    "                                      np.log(norm.pdf(x, loc=m, scale=np.sqrt(s2)) / \\\n",
    "                                             norm.pdf(x, loc=mu, scale=np.sqrt(sigma2)))\n",
    "quad(kl, -10, 10, (mu, sigma2, m, s2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.3465735902799727"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Exact solution\n",
    "def kld(mu, sigma2, m, s2): return ((sigma2 + (mu - m) ** 2) / s2 - np.log(sigma2 / s2) - 1) / 2\n",
    "kld(mu, sigma2, m, s2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "0038fac3296f4dbd93c1849b1244d24b",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "interactive(children=(FloatSlider(value=0.0, description='mu', max=2.0, min=-2.0), FloatSlider(value=1.0, desc…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_kld(mu, sigma2, m, s2, along):\n",
    "    figure, ax = plt.subplots(1, 2, figsize=(20, 7))\n",
    "    if along in [\"mu\", \"m\"]:\n",
    "        xrange = np.linspace(-2, 2)\n",
    "        yrange = kld(xrange, sigma2, m, s2) if along == \"mu\" else kld(mu, sigma2, xrange, s2)\n",
    "    elif along in [\"sigma2\", \"s2\"]:\n",
    "        xrange = np.linspace(0.1, 2)\n",
    "        yrange = kld(mu, xrange, m, s2) if along == \"sigma2\" else kld(mu, sigma2, m, xrange)\n",
    "\n",
    "    xmin = -2 if along in [\"mu\", \"m\"] else 0\n",
    "    ax[0].vlines(x=eval(along), ymin=0, ymax=2, linestyle=\"dashed\")\n",
    "    ax[0].hlines(y=kld(mu, sigma2, m, s2), xmin=xmin, xmax=2, linestyle=\"dashed\")\n",
    "        \n",
    "    ax[0].set_xlabel(along)\n",
    "    ax[0].plot(xrange, yrange)\n",
    "    ax[0].set_ylim(0, 2)\n",
    "    ax[0].set_title(f\"$KL(p||q)={kld(mu, sigma2, m, s2):0.3f}$\")\n",
    "    xrange = np.linspace(-3, 3, 100)\n",
    "    ax[1].plot(xrange, norm.pdf(xrange, mu, sigma2), label=f\"mu={mu}  sigma2={sigma2}\")\n",
    "    ax[1].plot(xrange, norm.pdf(xrange, m, s2), label=f\"mu={m}  sigma2={s2}\")\n",
    "    ax[1].legend(fontsize=\"x-large\")\n",
    "    \n",
    "interact(plot_kld,\n",
    "         mu=FloatSlider(value=0, min=-2, max=2, step=0.1),\n",
    "         sigma2=FloatSlider(value=1, min=0.1, max=2, step=0.1),\n",
    "         m=FloatSlider(value=0, min=-2, max=2, step=0.1),\n",
    "         s2=FloatSlider(value=1, min=0.1, max=2, step=0.1),\n",
    "         along=Dropdown(options=[\"mu\", \"m\", \"sigma2\", \"s2\"]));"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Using proof by induction, show that the inequality \n",
    "$$\n",
    "    f\\left(\\theta x + (1 - \\theta) y\\right) \\leq \\theta f(x) + (1 - \\theta) f(y)\n",
    "$$\n",
    "for convex functions implies\n",
    "$$\n",
    "    f\\left(\\sum_i \\theta_i x_i\\right) \\leq \\sum_i\\theta_i f(x_i)\n",
    "$$\n",
    "\n",
    "\n",
    "For $\\{x_i\\}_i \\in \\text{dom}(f)$ and $\\sum_i \\theta_i = 1$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "plt.style.use(\"seaborn\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.colorbar.Colorbar at 0x1a1d98d978>"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x396 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "kdef f(x): return x**2\n",
    "x1 = np.linspace(-2, 2, 100)\n",
    "x2 = np.linspace(-2, 2, 100)\n",
    "\n",
    "x1, x2 = np.mgrid[-2:2:0.1, -2:2:0.1]\n",
    "plt.contourf(x1, x2, f(x1 - x2) <= f(x1) - f(x2))\n",
    "plt.colorbar()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Exercise 1.39\n",
    "Consider the two binary variables $x$ and $y$ having the following joint relationship\n",
    "\n",
    "x\\y | 0 | 1\n",
    "---|---|----\n",
    "0 | 0 | 1 / 3\n",
    "1 | 1/3 | 1/3\n",
    "\n",
    "Evaluate the following quantities:\n",
    "* $H[x]$\n",
    "* $H[y]$\n",
    "* $H[y|x]$\n",
    "* $H[x|y]$\n",
    "* $H[x, y]$\n",
    "* $I[x, y]$\n",
    "\n",
    "We first note that"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "def P(x, y):\n",
    "    if x == 0 and y == 0:\n",
    "        return 0\n",
    "    if x == 1 and y == 1:\n",
    "        return 1 / 3\n",
    "    if x == 1 and y == 0:\n",
    "        return 1 / 3\n",
    "    if x == 0 and y == 1:\n",
    "        return 1 / 3\n",
    "    \n",
    "# Since P(x=x.) = P(x=x., y=0) + P(x=x., y=1) \n",
    "def Px(x): return P(x=x, y=0) + P(x=x, y=1)\n",
    "def Py(y): return P(x=0, y=y) + P(x=1, y=y)\n",
    "def Px_giv_y(x, y): return P(x=x, y=y)  / Py(y=y)\n",
    "def Py_giv_x(x, y): return P(x=x, y=y)  / Px(x=x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "P(x=0) = 33.333%\n",
      "P(x=1) = 66.667%\n",
      "\n",
      "P(y=0) = 33.333%\n",
      "P(y=1) = 66.667%\n",
      "\n",
      "P(x=0|y=0) = 0.000%\n",
      "P(x=1|y=0) = 100.000%\n",
      "\n",
      "P(y=0|x=1) = 50.000%\n",
      "P(y=1|x=1) = 50.000%\n"
     ]
    }
   ],
   "source": [
    "print(f\"P(x=0) = {Px(x=0):0.3%}\")\n",
    "print(f\"P(x=1) = {Px(x=1):0.3%}\")\n",
    "print()\n",
    "print(f\"P(y=0) = {Py(y=0):0.3%}\")\n",
    "print(f\"P(y=1) = {Py(y=1):0.3%}\")\n",
    "print()\n",
    "print(f\"P(x=0|y=0) = {Px_giv_y(x=0, y=0):0.3%}\")\n",
    "print(f\"P(x=1|y=0) = {Px_giv_y(x=1, y=0):0.3%}\")\n",
    "print()\n",
    "print(f\"P(y=0|x=1) = {Py_giv_x(y=0, x=1):0.3%}\")\n",
    "print(f\"P(y=1|x=1) = {Py_giv_x(y=1, x=1):0.3%}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6365141682948128"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Hx = -(np.log(Px(0)) * Px(0) + np.log(Px(1)) * Px(1)); Hx"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6365141682948128"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Hy = -(np.log(Py(0)) * Py(0) + np.log(Py(1)) * Py(1)); Hx"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$\n",
    "\\begin{align}\n",
    "    H[x|y] &= -\\sum_i\\sum_j P(x=i, y=j) \\log P(x=i|y=j) \\\\\n",
    "\\end{align}\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "def log(x): return 0 if x == 0 else np.log(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2.1972245773362196"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Hx_giv_y = -(log(P(x=0, y=0)) * Px_giv_y(x=0, y=0) +\\\n",
    "             log(P(x=1, y=0)) * Px_giv_y(x=1, y=0) +\\\n",
    "             log(P(x=0, y=1)) * Px_giv_y(x=0, y=1) +\\\n",
    "             log(P(x=1, y=1)) * Px_giv_y(x=1, y=1))\n",
    "Hx_giv_y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2.1972245773362196"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Hy_giv_x = -(log(P(x=0, y=0)) * Py_giv_x(x=0, y=0) +\\\n",
    "             log(P(x=1, y=0)) * Py_giv_x(x=1, y=0) +\\\n",
    "             log(P(x=0, y=1)) * Py_giv_x(x=0, y=1) +\\\n",
    "             log(P(x=1, y=1)) * Py_giv_x(x=1, y=1))\n",
    "Hy_giv_x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.0986122886681096"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Hxy = -(log(P(x=0, y=0)) * P(x=0, y=0) +\\\n",
    "        log(P(x=1, y=0)) * P(x=1, y=0) +\\\n",
    "        log(P(x=0, y=1)) * P(x=0, y=1) +\\\n",
    "        log(P(x=1, y=1)) * P(x=1, y=1))\n",
    "Hxy"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We define the mutual information between two r.vs $x$ and $y$ as\n",
    "$$\n",
    "I[x, y] = \\text{KL}(p(x, y)||p(x)p(y))\n",
    "$$\n",
    "Where,\n",
    "$$\n",
    "    \\text{KL}(p, q) = -\\int p(x) \\log\\frac{q(x)}{p(x)} dx\n",
    "$$\n",
    "\n",
    "Then,\n",
    "$$\n",
    "\\text{KL}(p(x,y)||p(x)p(y)) = -\\int\\int p(x, y) \\log\\left(\\frac{p(x)p(y)}{p(x, y)}\\right)dx dy\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.174416047921516"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Ixy = -sum([P(x=x, y=y) * log(Px(x=x) * Py(y=y) / P(x=x, y=y)) for x, y in product([0,1],[0,1]) if P(x, y) != 0])\n",
    "Ixy"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
